【问题标题】:How to rebind workspace switching to accented keys in xmonad?如何重新绑定工作区切换到 xmonad 中的重音键?
【发布时间】:2017-12-15 12:31:36
【问题描述】:

我最近决定从 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: 输入 â\200\230,â\200\231 解析错误

指的是这一行: , ((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 键):

不在范围内:â\200\230xK_ecaronâ\200\231

也许您的意思是 â\200\230xK_macronâ\200\231(从 XMonad 导入)

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

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

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

【问题讨论】:

  • 你确定你的文件中确实有.|.(即"\46\124\46"),而不是一些奇怪的非ASCII相似的东西吗?另外,请确保您的所有文件都是 UTF-8 编码的。 (Always!)
  • 是的,该行的文件中恰好有字节序列 \46\124\46。也应该在其他任何地方。而且它已经是 UTF-8 编码的。
  • 那么我真的很想知道这个奇怪的â\200\230,â\200\231 是如何潜入的。这些可能是终端转义码以某种方式被破坏为明文?你用的是什么终端? — 通常,发布完整的配置文件当然也很有用,即minimal reproducible example
  • 我同意@leftaroundabout。继续删除不相关的行,直到文件尽可能小。然后将文件连同在文件(或类似文件)上运行xxd 的输出一起发布。
  • 我直接去了绝对最小的一个,仍然没有运气。我用指向那个最小配置的要点链接更新了问题。 @leftaroundabout 我在一台机器上使用 gnome-terminal,在另一台机器上使用 xfce4-terminal。我尝试使用 vim 和 VS Code 编辑配置文件。

标签: haskell xmonad


【解决方案1】:

在您的最小配置中,

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,或者您可以搜索特定的on Hoogle

【讨论】:

  • 感谢Graphics.X11.ExtraTypes.XorgDefault 的帮助,现在“更紧凑”风格的工作区键绑定可以完美运行。但是,我无法编译您上面的示例。当我将 import qualified Data.Map as M 添加到最小配置时,我得到 3 个错误:Couldn't match expected type ‘M.Map (ButtonMask, KeySym) (X ())’ with actual type ‘XConfig Layout -&gt; M.Map (ButtonMask, KeySym) (X ())’Couldn't match type ‘XConfig l0 -&gt; KeyMask’ with ‘Foreign.C.Types.CUInt’ 重复。
  • @Lyarenei 哎呀,是的,我忘了绑定modMask,所以它获取的是记录选择器而不是来自conf 的值。您可以将\conf -&gt; keys conf 更改为\conf@(XConfig { modMask = modMask }) -&gt; keys def conf 来解决这个问题。大概。 (抱歉,我没有在这台机器上安装 xmonad 来确定测试。)
  • (未来的读者可以忽略我之前的评论:我已经修改了答案以包含其中发布的更正。)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-18
  • 2012-10-05
  • 2015-04-07
  • 1970-01-01
相关资源
最近更新 更多