我使用左 Alt 作为我的主要模式键,但对于某些应用程序,我想使用 Alt+键作为我的绑定,并且对于该特定应用程序,我希望左 winkey 作为我的模式键。
看来 logHook 是插入此逻辑的正确位置,但我很难理解如何做到这一点。
大大简化了,我的配置看起来像
import qualified XMonad.StackSet as W
import XMonad
import XMonad.Hooks.DynamicLog
main = do
-- some stuff
xmonad $ defaultConfig {
modMask = mod1Mask -- left winkey = mod4Mask, left alt = mod1Mask
, logHook = do
dynamicLogWithPP pp
}
在哪里
pp = dzenPP {
-- more stuff
}
我可以在 logHook 中获取当前窗口的名称
winset <- gets windowset
let wname = fmap getName (W.peek winset) -- here I have some window identificator in Maybe
但我不明白如何在我的主函数中动态替换 defaultConfig 中的 modMask 。
如果一个工作区的模式键有所不同,我也会很高兴。比如说,在工作区 1 到 8 上它是 Alt 键,在工作区 9 上它是左 Winkey。这也很好,我敢打赌这样的解决方案可以很容易地修改为基于当前聚焦的窗口。
答案1
这失败了。 XMonad 按预期工作,但应用程序不接收按下的按键。我的意思是,我在第五个工作区上使用 winkey 作为 modKey,在其他工作区上使用 altkey。我曾经使用 modKey+number 来切换工作区。当我在第五个工作区上按 Alt+2 时,XMonad 不执行任何操作(这是正确的),应用程序也不执行任何操作(这是错误的)。 Chrome 不会切换到第二个选项卡,依此类推。
好的,所以我设法做到了,使用XMonad.Actions.PerWorkspaceKeys。
相关配置:
import XMonad.Actions.PerWorkspaceKeys
workspaceModkeys = [ (mod1Mask, map show ([1..4] ++ [6..9])) -- use Alt as modkey on all workspaces
, (mod4Mask, ["5"]) -- save 5th (use Win there)
]
modifiedKeysList conf =
[ ((0, xK_Return), spawn $ XMonad.terminal conf) -- launch a terminal
, ((shiftMask, xK_c ), kill) -- close focused window
]
unmodifiedKeys conf =
[ ((0, xF86XK_AudioPlay ), spawn "mpc toggle")
, ((0, xF86XK_AudioStop ), spawn "mpc stop")
]
keysList conf = concat (map modifyKey (modifiedKeysList conf)) ++ (unmodifiedKeys conf)
modifyKey :: ((KeyMask, KeySym), X()) -> [((KeyMask, KeySym), X())]
modifyKey k = map (f k) workspaceModkeys
where
f ((mask, key), action) (mod, workspaces) = ((mask .|. mod, key), bindOn (map (\w -> (w, action)) workspaces))
myKeys conf = M.fromList $ keysList conf
main = xmonad $ defaultConfig {
keys = myKeys
}
列表 modifiedKeys 将使用修饰符(在此示例中 - 第 5 个工作区上的 Winkey,并在所有其他工作区上保留 Alt),列表 unmodifiedKeys 按原样使用。
稍后仍然可能会研究特定于窗口的键,但我现在已经完成了。