Emacs keybings Everywhere!

简介

xkeysnail 是一个非常强大的 keyboard remapping 工具, 它类似于 xmodmap, 但更为灵活. 不仅能重映射键位, 还能重映射快捷键, 甚至能在不同的程序下使用不同的映射!

再也不用两套快捷键换来换去了!! ( 早点知道这个东西, 我就不至于练就一身无缝切换快捷键的毫无卵用的本领了…

项目地址: https://github.com/mooz/xkeysnail

安装

Arch Linux

1
pikaur -S xkeysnail

Other

1
pip install xkeysnail --user

注: 官方文档里使用的是 sudo pip 来安装, 但不推荐这样做. 尤其是 pip 这种辣鸡包管理器, 很容易把系统的包管理搞乱.

用法

首先下载 官方示例, 然后用以下命令执行

1
sudo xkeysnail config.py

不出意外地话应该没有报错, 然可以切换到一个不支持 Emacs 快捷键的环境, 比如浏览器. 试一下 C-a, C-e 等基本的快捷键是否能工作.

如果遇到 Xlib.error.DisplayConnectionError: Can't connect to display ":0.0": b'No protocol specified\n' 这样的错误, 可以尝试

1
2
xhost +SI:localuser:root
sudo xkeysnail config.py

其中 xhost 命令需要通过 pacman -S xorg-xhost 安装

如果你有热插拔键盘的需求, 还需要加上 -watch 开关

编写 config.py

如果你是 Emacs user 的话, 基本上直接使用官方配置就行了…最多加一下白名单, 比如我的 Alacritty 和 JB 家的 IDE 都是 Emacs 风格快捷键, 就可以排除它们了.

运行 xprop WM_CLASS, 然后点击目标窗口, 就可以获得这个窗口的 wm_class

如果打算自己编写的话也非常容易, 官方示例有详细的注释, 可以照着示例来写.

我遇到的唯一一个坑是我的 Compose 键占用了右 Ctrl, 然后导致有些快捷键不起作用 ( 我也不知道为什么这些快捷键会使用右 Ctrl…) 所以如果你配置了其他键盘映射程序建议暂时关掉, 免得出现莫名其妙的错误.

自动启动

启动 xkeysnail 后, 我们基本上可以在每个应用里都愉快地使用 Emacs 风格的快捷键了. 但是还缺一个自动启动, 推荐编写一个 systemd 服务来完成. ( systemd 是个好东西, 应该多多使用 )

赋予当前用户必要权限

这个步骤的目的是让 xkeysnail 不需要 root 权限也能执行.

首先我们增加一个 uinput 组

1
sudo groupadd uinput

然后将当前用户添加到 input 和 uinput 组中 ( 这个步骤似乎并不是即时生效的, 执行完这条命令可以用 groups 查看一下当前用户所属的组, 如果没有 input & uinput 的话可以重启或者重新登录试试 )

1
sudo usermod -a -G input,uinput $USER

然后编写两个 udev 规则, 放在 /etc/udev/rules.d/

input.rules

1
KERNEL=="event*", NAME="input/%k", MODE="660", GROUP="input"

uinput.rules

1
KERNEL=="uinput", GROUP="uinput"

接着应用这两条规则

1
sudo udevadm control --reload-rules && udevadm trigger

编写 service

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
# https://qiita.com/samurai20000@github/items/2e1d779e806a7e8543d6

[Unit]
Description=xkeysnail

[Service]
# DISPLAY 的值应该和 `echo $DISPLAY` 的值相同
Environment=DISPLAY=:0
ExecStartPre=-xhost +SI:localuser:root
# 此处禁用了按键状态的输出, 因为我不想要一大堆毫无卵用的日志...
ExecStart=xkeysnail -q /home/aloxaf/.config/xkeysnail/config.py
Type=simple
Restart=always
RestartSec=2

[Install]
WantedBy=default.target

将以上代码保存为 ~/.config/systemd/user/xkeysnail.service, 然后执行 systemctl --user --now enable xkeysnail.service.

完成了! 享受到处都能使用 Emacs 风格快捷键的快感吧!

顺便列举下 systemd 的常用操作 ( 推荐 alias userctl='systemctl --user')

  • userctl status xkeysnail.service 查看服务状态
  • userctl restart xkeysnail.service 重启服务
  • journalctl --user -u xkeysnail.service 查看完整日志
  • journalctl --user -f -u xkeysnail.service 查看最近日志

参考资料: https://qiita.com/samurai20000@github/items/2e1d779e806a7e8543d6`