虽然有人推过了, 再来推荐一波xkeysnail, 功能更完善了一点

xkeysnail 在 Gnome + Wayland + Arch 下,有一个存在了很久的问题。(排除不同版本的差异, 均有很大机会发生)

在启动 xkeysnail 的时候,会遇到随机某个按键失效。

例如: 第一次重启,空格键失效,下一次重启,a 失效, 再一次, l 失效,

我平常很少重启重启电脑,所以一旦有一次正常,我就用很久,所以还好,

今天因为调试一些东西的目的,多重启了几次,然后,基本上每次进来都这个或那个键不能用

最狠的一次,启动后不行,我就 logout, 再进来另一个键又失效了,再 logout, 我重复了 7 次,都快让整哭了 …

打算明天不用这个了,只用系统集成功能设定 Capslock 为 Ctrl. 右侧 Alt 为 Capslock 算了。

下面是我写的一个脚本,在 Gnome 下可以用的 (无论 X 或 Wayland 均可)

1 个赞

请问下xkeysnail 怎么表示单个Shift 按键。我希望将Shitf 在Emacs 下映射为 C-\。xkeysnail的如下设置没法生效:

define_keymap(re.compile("Emacs"), {
    K("Shift"): K("C-backslash"),
}, "Emacs")

没用xkeynail,不过类似这样的问题我也困惑好久了,emacs识别shift键按下该怎么写?我定义了很多shift开头的快捷键键,都是直接用的大写字母

在 Windows 系统通过 AHK 很容易实现 单个 Shift 或者 Ctrl 映射为其他组合键。 我这样做只是为了在 Linux 系统下输入法的切换方式统一。

define_multipurpose_modmap 可以分别设置一个键单独按下和与其他键一起按下时的行为,我把空格映射到了 Ctrl

define_multipurpose_modmap({
    Key.SPACE: [Key.SPACE, Key.LEFT_CTRL]
})

这种搞法似乎只能映射到 Key.XXX 而不是 K("XXX"),不过你的这个需求可以先把单按 Shift 映射到键盘上没有的键比如 F13,再把 F13 映射到 C-\

多谢。你的这个思路确实可以解决我的问题。再请教下,define_multipurpose_modmap 能否指定只在Emacs 生效?

还有个 define_conditional_multipurpose_modmap,似乎可以指定启用这个映射 condition

:+1: 感谢 @dimlight1998 终于可以在系统和Emacs 都用 Shift来切换输入法了 :grinning:
这里我 映射 左Shift —> F19 ,F19 —> C-\. Xkeysnail 设置如下:

define_conditional_multipurpose_modmap(lambda wm_class: wm_class in ("Emacs"), {
   Key.LEFT_SHIFT: [Key.F19, Key.LEFT_SHIFT],
})

define_keymap(re.compile("Emacs"), {
    K("F19"): K("C-Backslash"),
}, "Emacs")
1 个赞

在终端使用有些组合键识别不了有没有办法处理?比如有个机器按下m+d会被搞成5~

终端中的emacs也是很多组合键无法使用,关了xkeysnail就好了,每次使用都得关了xkeysanil然后各种键位不适应太上头

你可以在通用映射中排除终端,并针对终端进行单独的映射。可以参考下我的配置文件,我在 Arch 下面用的终端是Konsole。

我怎么感觉我俩配置差不多呢?我的配置

你在终端里面用Emacs 的话,就不要在终端用xkesnail 了。 你下面这个设置应该就会影响Emacs的相关按键。 建议注释掉这段。

define_keymap(re.compile("XTerm"), {
    K("C-x"): {
        # C-x C-c (exit)
        K("C-c"): K("M-f4"),
        K("c"): K("M-f4"),},
}, "Xterm")

wo X,草率了。了然,谢