Emacs 本身的按键机制需要用户最少按一个组合键才能执行一个命令, 如果用户只按一个修饰键, 比如只按 Shift 时, Emacs 本身并不会触发一个 Shift 按键事件。
这样的机制在大部分 Emacs 场景都没有问题, 但是对于输入法场景就很不方便, 用户每次切换中英文都需要按一个组合键, 不能像传统输入法那样只需要按一次 Shift 键就可以快速切换输入法状态。
这半个月都在旅游自驾, 今天东北下大雨, 终于有时间写会儿代码来解决这个问题啦。
key-echo 是一个利用 XRecord 技术来实现的全局按键监听插件, 它可以监听一些特殊的单按键事件, 比如用户只是按了一下 Shift 辅助键而没有按其他字母按键时, 发送信号给 Emacs, 让 Emacs 执行一些 Elisp 代码, 比如切换输入法。
安装
- 安装 Emacs 28 及以上版本
- 安装 Python 依赖:
- Linux:
pip3 install epc sexpdata six pynput
- Windows:
pip3 install epc sexpdata six pynput pygetwindow
- macOS:
pip3 install epc sexpdata six pynput pyobjc
- Linux:
- 用
git clone
下载此仓库, 并替换下面配置中的 load-path 路径 - 把下面代码加入到你的配置文件 ~/.emacs 中:
(add-to-list 'load-path "<path-to-key-echo>")
(require 'key-echo)
(key-echo-enable)
(defun key-echo-shift-to-switch-input-method (key)
(interactive)
(when (string-equal key "Key.shift")
(toggle-input-method)
))
(setq key-echo-single-key-trigger-func 'key-echo-shift-to-switch-input-method)
加上上面设置后, 按 Shift 可以自由切换输入法。
选项
- key-echo-keyboard-quit-key: 我们无法通过调用
keyboard-quit
函数来实现Ctrl + g
的功能, 所以默认设置key-echo-keyboard-quit-key
为Key.alt_r
来实现当用户按右边的 Alt 键时, 发送Ctrl + g
按键给 Emacs, 来实现快速按 Ctrl + g 的目标