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


12

我在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+fwin+f。我怎样才能做到这一点?


这样的交叉发布(在此处和在stackoverflow上)真的是平常的事吗?
ДМИТРИЙМАЛИКОВ

否:我们不建议这样做
jasonwryan 2011年

SO不在主题上,所以我请他们摆脱他们的副本
Michael Mrozek

@ dmitry.malikov这似乎是个更好的地方。
xralf 2011年

更好 xralf删除了SO副本。非常感谢
Michael Mrozek

Answers:


8

查看XMonad的contrib软件包,您会发现XMonad.Actions.WindowGo,该软件包导出以下功能

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

它使用要运行的程序的字符串参数,例如“ firefox”;以及一个布尔查询,用于通过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”匹配的类名的窗口,它将被聚焦设置为master,即,根据您最近的布局,将是大窗口
  • 如果没有窗口的比赛,火狐将催生设置为主

可以通过Full在调用后选择布局来模拟最大化runOrRaiseMaster如下所述

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

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

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

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

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

编辑)代码行中缺少>>

编辑2- modm > modMask

Edit3 xmonad.hs有望工作。

为什么不为您学习Haskell带来的好处?


感谢您的工作答案和其他信息以及Haskell教程。我喜欢Haskell语法和功能范例。唯一不起作用的部分>> (sendMessage $ JumptoLayout "Full")是构造函数存在一些错误。也许这很容易,我将在学习Haskell之后解决。
xralf 2011年

我忘记了:但这modm不起作用,我仍在使用controlMask
xralf 2011年

@xralf,(1)缺少括号-现在可以使用吗?(2)我需要你们全体xmonad.hs来解决这个问题;最好只是在这里查看配置档案,看看其他人是如何做到的或使用提到的EZConfig
sr_

支架没有帮助。是我正在使用的xmonad.hs文件。
xralf

(1)方括号仍然是错误的,X ()绑定键的类型应为(runOrRaiseMaster ...) >> (sendMessage ...),导致,((...,...), (runOrR...) >> (send...) ) (a (before run...
sr_11年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.