【问题标题】:XMonad: how to bind Super (Win key) + Space to keyboard layout switch?XMonad:如何将 Super(Win 键)+ Space 绑定到键盘布局开关?
【发布时间】:2015-04-07 19:06:45
【问题描述】:

我曾经在 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 作为键盘开关组合,更精确我不知道是不是这样可能。

【问题讨论】:

  • 简短说明:-- bla 用于单行 cmets,{- bla -} 用于多行 cmets。
  • (: 当然,我个人很少使用多行 cmets,这里是我试图强制 SO 前端将评论呈现为评论(我期待浅灰色),但它非常顽固.-- blah 被渲染成黑色,这带来了歧义,你看到了吗 (++ ++ -- ++)?现在已修复 (;
  • @deshtop,顺便谢谢你和mhwombat
  • 在我看来,您应该将问题中的解决方案剪切并粘贴到答案中。
  • @dfeuer,我从未见过我可以编辑答案!好主意。顺便说一句,这个解决方案有一个警告:rWinWin+Space 键序列都会触发布局更改。如果你(不小心)按下rWin,布局会改变;那么如果你按下Win+Space 并且布局再次改变,但是XMonad 的绑定(我使用Win 键作为XMonad 修饰符)不起作用,你必须再次按下rWin 才能使用XMonad 键。我仍在尝试找出更改布局的最佳方法。也许 Xkb 插件应该是解决方案。

标签: haskell emacs key-bindings xmonad keyboard-layout


【解决方案1】:

您所要做的就是取消绑定Win-Space(使用removeKeys),并为xmonad 布局切换和键盘布局切换创建绑定(使用additionalKeysadditionalKeysP)。 Details and examples in the documentation。 可以使用 Core 库中的spawn 启动键盘布局切换命令。

【讨论】:

  • @destop,我知道你上面提到的功能,我实际上已经找到了你提供的解决方案,虽然无法实现它。我缺少的部分是生成命令,即我不知道在 Linux 中切换布局的确切命令。我试图生成setkbdmap,但这不是我需要的。你能指点我这样的命令吗?
  • 我认为你需要的命令是setxkbmap。检查手册页并在命令行中进行实验以验证您想要的确切命令,然后将 spawn 命令添加到您的 xmonad.hs。
  • 我已将我的解决方案添加到问题正文中,尽管它按预期工作我发现将单个右 Win 作为布局切换器是任何 Win+Space 的很好替代品组合。干杯!
【解决方案2】:

我能够使用一个 shell (zsh) 脚本来完成此操作,该脚本保存在我的路径中,为 cycle-keyboard-layout

#!/usr/bin/env zsh

total_layouts="${#@}"
current_layout=$(setxkbmap -query | awk '/layout:/{ print $2 }')
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+空格键(我使用 +空格键 对于其他事情)在 dvorak 和我们 qwerty 之间切换我的布局。要使用其他布局,只需将dvorak us 替换为空格分隔的布局列表,可以使用setxkbmap layout 设置。

我的完整骨架 xmonad.hs 位于 https://github.com/schlueter/xmonad-config/blob/master/xmonad.hs

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-19
    • 2011-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多