如果程序正在运行,如何更改 xmonad 中热键的行为?

如果程序正在运行,如何更改 xmonad 中热键的行为?

我在配置文件中使用了一些键映射xmonad.hs

...
    , modMask = mod4Mask     -- Rebind Mod to the Windows key
...
 [ ((controlMask, xK_Print), spawn "sleep 0.2; scrot -s")
 , ((0, xK_Print), spawn "scrot")
 , ((controlMask, xK_f), spawn "firefox")
 ]

firefox按 时将运行第三个映射ctrl+f。我想做一些更复杂的事情:

if (firefox is running):
  focus and maximize firefox window:
else:
  run firefox

而且我想ctrl+f改成win+f.我怎样才能做到这一点?

答案1

看着XMonad 的贡献包, 你会找到XMonad.Actions.WindowGo,它导出以下功能:

runOrRaiseMaster :: String -> Query Bool -> X ()

它接受程序的字符串参数跑步,例如“火狐”;以及使用的布尔查询查明它是否已经在运行,通过 X11 属性,例如(className =? "Firefox")(参见顶部XMonad.Actions.WindowGo对于变体)。

因此,您所需要做的就是绑定runOrRaiseMaster "firefox" (className =? "Firefox")到您想要的密钥,如解释于XMonad.Doc.Extending, 通过

((modMask, xK_f ), runOrRaiseMaster "firefox" (className =? "Firefox"))

作为配置键绑定的一部分Data.Map(详细信息因您的设置方式而异,即您的整个xmonad.hs,请参阅添加按键绑定)。

笔记没有真正的意义最大化窗口在 XMonad 中。当您按照说明进行设置后,您将Mod4执行f以下操作:

  • 如果有一个类名与“Firefox”匹配的窗口,它将被集中设置为主控,即取决于您最近的布局, 将大窗户
  • 如果没有窗口匹配,则 Firefox 将产生的设置为主控

可以通过Full调用后选择布局来模拟最大化runOrRaiseMaster正如这里所描述的:

("M-<F1>", sendMessage $ JumpToLayout "Full")

(请注意,此示例还演示了XMonad.Util.EZConfig允许更简单的键绑定定义)

组合这两件事也是可能的。两者都是类型X (),即它们是在 X Monad 中。使用>>,其类型为(用:t (>>)in进行检查ghci

(>>) :: Monad m => m a -> m b -> m b

我们也有两种类型(runOrRaiseMaster "firefox" (className =? "Firefox")) >> (sendMessage $ JumpToLayout "Full")的组合,因此它可以绑定到一个键。X ()X ()

)编辑代码行中缺少>>

编辑2 modm-> modMask

编辑3 xmonad.hs希望有效。

为什么不学一门 Haskell 来大有裨益呢?

相关内容