Emacs有没有识别修饰键按下的功能?

准确的说是相关的hack,vanilla估计是不行。比如我能不能监听一个control键按下control键松开这样的事件?

不能。图形界面的有实现的可能,终端的没有实现的可能,一般的终端模拟器似乎只能告诉程序用户按了哪个键,没有 keyup/keydown 信息。

EAF 实现了类似的功能, 可以参考: https://github.com/manateelazycat/emacs-application-framework/blob/d9fa1383cf65cae9103c151a048f0557fb556a20/eaf.el#L335

EAF 的 eaf-monitor-key-event 只是监听 eaf-buffer 的所有键盘事件, 理论上, 可以改成监听全局的所有键盘事件

得到键盘事件以后, 可以通过判断 key event 的 modifier 来判断 ctrl 是否按下, 类似: https://github.com/manateelazycat/emacs-application-framework/blob/d9fa1383cf65cae9103c151a048f0557fb556a20/core/browser.py#L89

Qt和Gtk都有判断 key event modifier 的函数, 如果在 Emacs 中, 可以借助操作系统相关的库, 比如在 linux 下捕获 elisp 键盘事件的时候, 通过 x11 xrecord extension 可以键盘事件状态, 可以参考我的文章: Linux全局事件监听技术

如果你对 x11 很熟悉, 可以用我上面的文章写一个针对 emacs 窗口的事件监听程序(理论上也可以监听任意其他程序的事件按下, 释放状态), 然后通过 EAF key monitor 来对比事件的时间戳来计算出当前 emacs 的键盘事件状态.

2 个赞

Linux 下可以通过我的文章 https://www.jianshu.com/p/80cf81413d31 中介绍的技术监听任意程序, 包括终端模拟器.

其他操作系统也有类似的操作系统级别的键盘事件监听钩子.

最优雅的方法, 估计在emacs c 源码下面自己加 hook 了, 这种方法如果源码不进入emacs分支, 估计升级emacs是个麻烦事.

看来不依赖外部程序,以我的水平很难做到啊(我用的是mac)。我能想到的是用外部程序监听然后emacsclient --eval

可以用 Hammerspoon 写 Lua 程序干类似的事情, 然后 emacsclient …

虽然很low……但是感觉实现起来没太大问题