XMonad:如何将 Super(Win 键)+ Space 绑定到键盘布局开关?
XMonad: how to bind Super (Win key) + Space to keyboard layout switch?
我曾经在 Windows 8 上按 ❖ win+spacebar 切换键盘布局,并且⌘+spacebar 在 OS X 上。
但是,在 Linux 上,我有 ❖ win 键专用于 XMonad 作为修饰键。因此,要在布局之间切换,我必须使用 alt+⇧ shift。
在我安装 Emacs 之前这不是问题。现在我可以使用所有 meta+shift 组合键,因为我有 alt 作为 meta (⎋ escape 可以帮忙,但很不方便)。
我认为这种情况最简单的解决方法是配置 ❖ win+space 布局开关组合。虽然 XMonad 默认使用这种组合来切换布局,但我很少在两个方向循环布局,所以我很高兴 ❖ win+space用于切换键盘布局,而❖win+shift+space为切换 XMonad 布局。如果我可以进行这样的配置,我将能够在 Emacs 中使用 alt 键作为 meta。
但是,我不知道如何让XMonad使用❖ win+space作为键盘开关组合, 更精确我不知道是否有可能。
您所要做的就是取消绑定 Win-Space
(使用 removeKeys
),并为 xmonad 布局切换和键盘布局切换创建绑定(使用 additionalKeys
或 additionalKeysP
).
Details and examples in the documentation。
可以使用核心库中的 spawn
启动键盘布局切换命令。
我能够通过 shell (zsh) 脚本在我的路径中保存为 cycle-keyboard-layout:
来完成此操作
#!/usr/bin/env zsh
total_layouts="${#@}"
current_layout=$(setxkbmap -query | awk '/layout:/{ print }')
current_index="${@[(i)$current_layout]}"
next_index="$((current_index % total_layouts + 1))"
next_layout="${@[$next_index]}"
setxkbmap "$next_layout"
然后,在我的 xmonad.hs 我包括:
import XMonad.Util.CustomKeys (customKeys)
altMask = mod1Mask
main =
xmonad $ defaultConfig
{ keys = customKeys delkeys inskeys
, modMask = mod4Mask
}
inskeys :: XConfig l -> [((KeyMask, KeySym), X ())]
inskeys conf@XConfig {modMask = modMask} =
[ -- modMask + alt + space
, ((modMask .|. altMask, xK_space),
spawn "cycle-keyboard-layout dvorak us")
]
delkeys :: XConfig l -> [(KeyMask, KeySym)]
delkeys XConfig {} = []
现在⌘+alt+spacebar(我用⌘+spacebar 其他)在 dvorak 和 us qwerty 之间切换我的布局。要使用其他布局,只需将 dvorak us
替换为可以使用 setxkbmap layout
设置的 space 分隔的布局列表。
我的裸体 xmonad.hs 在 https://github.com/schlueter/xmonad-config/blob/master/xmonad.hs.
我曾经在 Windows 8 上按 ❖ win+spacebar 切换键盘布局,并且⌘+spacebar 在 OS X 上。
但是,在 Linux 上,我有 ❖ win 键专用于 XMonad 作为修饰键。因此,要在布局之间切换,我必须使用 alt+⇧ shift。
在我安装 Emacs 之前这不是问题。现在我可以使用所有 meta+shift 组合键,因为我有 alt 作为 meta (⎋ escape 可以帮忙,但很不方便)。
我认为这种情况最简单的解决方法是配置 ❖ win+space 布局开关组合。虽然 XMonad 默认使用这种组合来切换布局,但我很少在两个方向循环布局,所以我很高兴 ❖ win+space用于切换键盘布局,而❖win+shift+space为切换 XMonad 布局。如果我可以进行这样的配置,我将能够在 Emacs 中使用 alt 键作为 meta。
但是,我不知道如何让XMonad使用❖ win+space作为键盘开关组合, 更精确我不知道是否有可能。
您所要做的就是取消绑定 Win-Space
(使用 removeKeys
),并为 xmonad 布局切换和键盘布局切换创建绑定(使用 additionalKeys
或 additionalKeysP
).
Details and examples in the documentation。
可以使用核心库中的 spawn
启动键盘布局切换命令。
我能够通过 shell (zsh) 脚本在我的路径中保存为 cycle-keyboard-layout:
来完成此操作#!/usr/bin/env zsh
total_layouts="${#@}"
current_layout=$(setxkbmap -query | awk '/layout:/{ print }')
current_index="${@[(i)$current_layout]}"
next_index="$((current_index % total_layouts + 1))"
next_layout="${@[$next_index]}"
setxkbmap "$next_layout"
然后,在我的 xmonad.hs 我包括:
import XMonad.Util.CustomKeys (customKeys)
altMask = mod1Mask
main =
xmonad $ defaultConfig
{ keys = customKeys delkeys inskeys
, modMask = mod4Mask
}
inskeys :: XConfig l -> [((KeyMask, KeySym), X ())]
inskeys conf@XConfig {modMask = modMask} =
[ -- modMask + alt + space
, ((modMask .|. altMask, xK_space),
spawn "cycle-keyboard-layout dvorak us")
]
delkeys :: XConfig l -> [(KeyMask, KeySym)]
delkeys XConfig {} = []
现在⌘+alt+spacebar(我用⌘+spacebar 其他)在 dvorak 和 us qwerty 之间切换我的布局。要使用其他布局,只需将 dvorak us
替换为可以使用 setxkbmap layout
设置的 space 分隔的布局列表。
我的裸体 xmonad.hs 在 https://github.com/schlueter/xmonad-config/blob/master/xmonad.hs.