前言#
目标#
使用 caps2esc ,让 Caps Lock 键在单独按下时充当 Escape 键,在与其他键组合按下时充当 Control 键。
动机#
愉快、符合人体工程学,系统范围地将 Caps Lock 映射为非常有用的 Escape 和 Control 键,以及拥有更好的 Vim 或 Emacs 体验。
参考#
介绍#
caps2esc 实用程序允许您在 libevdev 库级别将 Caps Lock 重新映射到 Escape 和 Control。因为 libevdev 相对底层——仅高于操作系统内核——所以此解决方案除了图形环境外,还适用于纯 Linux 控制台。
安装使用#
安装#
从 Arch 仓库安装 caps2esc 包:
# Install caps2esc
sudo pacman -S interception-caps2esc
这还会将 interception-tools 包作为依赖项进行安装。 interception-tools 包含一个名为 udevmon 的输入设备监视程序,我们将使用它来捕获 Caps Lock 和 Escape。
配置#
创建配置文件 /etc/udevmon.yaml (如果不存在),并在其中添加以下配置:
- JOB: "intercept -g $DEVNODE | caps2esc | uinput -d $DEVNODE"
DEVICE:
EVENTS:
EV_KEY: [KEY_CAPSLOCK, KEY_ESC]
说明(点击展开)
此
udevmon作业在按下 Caps Lock 和 Escape 键(由名称KEY_CAPSLOCK和KEY_ESC标识)时运行 shell 命令intercept -g $DEVNODE | caps2esc | uinput -d $DEVNODE;udevmon将根据需要将$DEVNODE变量设置为匹配设备的路径(/dev目录中的某个虚拟文件)。shell 命令使用
intercept程序获取 Caps Lock 或 Escape 键的输入设备,将键事件管道传输到caps2esc程序(该程序实现 Caps Lock 到 Escape/Control 逻辑),然后使用uinput将处理后的输出管道传输回虚拟键设备。(你可以阅读 Interception Tools/How it works 以了解详细信息。)
Tip:上述 udevmon 配置将使 Caps Lock 作为 Escape 和 Control 键工作,并将 Escape 键作为 Caps Lock 键工作。如果您希望 Escape 键仍作为 Escape 键工作,您可以用 caps2esc -m 1 替换 caps2esc ,它使用 caps2esc “最小模式”并且不影响 Escape 键(有关文档,请参见 caps2esc -h )。
您现在只需启动 udevmon 程序,我们将使用 systemd 单元来执行此操作。
配置 udevmon 的 systemd 服务#
创建 systemd 服务单元文件 /etc/systemd/system/udevmon.service (如果不存在),并在其中添加内容:
[Unit]
Description=udevmon
Wants=systemd-udev-settle.service
After=systemd-udev-settle.service
# Use `nice` to start the `udevmon` program with very high priority,
# using `/etc/udevmon.yaml` as the configuration file
[Service]
ExecStart=/usr/bin/nice -n -20 /usr/bin/udevmon -c /etc/udevmon.yaml
[Install]
WantedBy=multi-user.target
此服务单元以非常高的优先级启动 udevmon 程序( nice 允许您设置程序的调度优先级; -20 niceness 是最高可能的优先级)。确保 ExecStart 行(例如 /usr/bin/udevmon )中的 uvdevmon 路径与 which udevmon 的输出相匹配。
然后启用并启动 udevmon 服务:
# Enable and start the `udevmon` service
sudo systemctl enable --now udevmon.service
# Optionally verify the `udevmon` service is active and running
systemctl status udevmon
此时应该已经完成了,尝试使用例如 <CapsLock>-L 来清除终端屏幕(就像你通常使用 <Ctrl>-L 所做的那样)。如果启用了 udevmon 服务,则 udevmon 会自动在系统启动时启动。
