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 布局切换和键盘布局切换创建绑定(使用 additionalKeysadditionalKeysP). 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.hshttps://github.com/schlueter/xmonad-config/blob/master/xmonad.hs.