如何将工作区切换重新绑定到 xmonad 中的重音键?

How to rebind workspace switching to accented keys in xmonad?

我最近决定从 i3wm 切换到 xmonad。我找到 this configuration 并决定尝试一下。该配置开箱即用,没有任何问题。

问题是,我无法切换桌面工作区,因为我没有使用英文键盘布局。我在 F 键行下使用重音字符而不是数字。

所以我搜索了这些键的 xK_ 名称并将它们放入配置文件中,如下所示:

[((m .|. modMask, k), windows $ f i)
    | (i, k) <- zip (XMonad.workspaces conf) [xK_plus, xK_ecaron, xK_scaron, xK_ccaron, xK_rcaron, xK_zcaron, xK_yacute, xK_aacute, xK_iacute]
    , (f, m) <- [(W.greedyView, 0), (W.shift, shiftMask)]]

但是,这没有用。所以我尝试绑定至少一个键(根据 this answer)以查看它是否至少可以工作(上面的代码已被注释掉):

    , ((0 .|. modMask, xK_plus), windows $ W.greedyView "1")
    , ((shiftMask .|. modMask, xK_plus), windows $ W.shift "1")

但事实并非如此。在这两种情况下,错误消息都是:

xmonad.hs:292:9: parse error on input â00,â01

其中指的是这一行: , ((0 .|. modMask, xK_plus), windows $ W.greedyView "1"),如果我没记错的话具体到|

当我尝试时

[((m .|. modMask, k), windows $ f i)
    | (i, k) <- zip (XMonad.workspaces conf) [xK_1, xK_2, xK_3, xK_4, xK_5, xK_6, xK_7, xK_8, xK_9]
    , (f, m) <- [(W.greedyView, 0), (W.shift, shiftMask)]]

它没有任何问题,但是,当我尝试时

    , ((0 .|. modMask, xK_1), windows $ W.greedyView "1")
    , ((shiftMask .|. modMask, xK_1), windows $ W.shift "1")

抛出同样的错误。

我正在使用捷克语 QWERTY 布局和 xmonad 0.12。

你能告诉我我做错了什么吗?谢谢。

编辑:

Here 是最小配置文件。

我在另一台机器上碰运气时也取得了一些进步。有

[((m .|. modMask, k), windows $ f i)
    | (i, k) <- zip (XMonad.workspaces conf) [xK_plus, xK_ecaron, xK_scaron, xK_ccaron, xK_rcaron, xK_zcaron, xK_yacute, xK_aacute, xK_iacute]
    , (f, m) <- [(W.greedyView, 0), (W.shift, shiftMask)]]

我收到了不同的错误消息,它说(对于所有 caron 键):

Not in scope: â00xK_ecaronâ01

Perhaps you meant â00xK_macronâ01 (imported from XMonad)

由于建议的解决方案是完全不同的密钥,我简单地继续删除所有 xK_~caron 并且它令人惊讶地编译。现在我可以切换工作区,但是使用 ý 键切换到第二个工作区有点奇怪。

现在我不明白为什么不接受 caron 密钥,因为 xK_ecaron 是完全有效的密钥:

~ $ cat /usr/include/X11/keysymdef.h |grep ecaron
#define XK_ecaron                        0x01ec  /* U+011B LATIN SMALL LETTER E WITH CARON */

在您的最小配置中,

import XMonad
import qualified XMonad.StackSet as W

--bind xK_plus to workspace 1
    , ((0 .|. modMask, xK_plus), windows $ W.greedyView "1")
    , ((shiftMask .|. modMask, xK_plus), windows $ W.shift "1")

main = xmonad def
    { terminal    = "gnome-terminal"
    }

...您的文件中间有裸键绑定。这些必须作为键绑定列表的一部分出现;逗号是列表元素分隔符。所以:

main = xmonad def
    { terminal    = "gnome-terminal"
    , keys        = \conf@(XConfig { modMask = modMask }) -> keys def conf `mappend` M.fromList
        [ ((0 .|. modMask, xK_plus), windows $ W.greedyView "1")
        , ((shiftMask .|. modMask, xK_plus), windows $ W.shift "1")
        ]
    }

(或类似的。)

对于您的其他问题,xK_ecaron 可从 Graphics.X11.ExtraTypes.XorgDefault 获得。您可以看到所有可用键符的列表(以及导入哪个模块来获取它们)here, or you can search for a specific one on Hoogle.