在 vterm 中绑定 C-c 到 vterm--self-insert 不起作用

遇到一个关于键位绑定的问题无法理解,所以来向各位请教一下相关知识。

我在使用 vterm 时,在 vterm-mode-map 里定义 C-cvterm--self-insert。起初是有效的,但切换 buffer 之后再切回来,C-c 就 fallback 到全局的定义了。(还使用了 meow 这个包,可能有影响,但这不是重点)

我无法理解的是,我用 describe-keymap 查看 vterm-mode-map,可以看到 C-c 的定义还存在;而用 describe-bindings 查看键位绑定,除了 global-bindings 以外,就没有关于 C-c 的绑定了。即,没有其它 keymap 覆盖,vterm-mode-map 自身也没有被修改,vterm-mode-mapC-c 不知为何就不起作用了。

可以用describe-key (C-h k) + 按键 查看实际生效的函数。 很可能是被优先级更高的keymap给拦截了(可能就是meow)

describe-key 并输入 C-c,它在等待后续输入,应该是 fallback 到全局绑定了。前面用 describe-binding 检查时也留意过,其它 keymap 应该是没有关于 C-c 的绑定。(meow 没有覆盖 C-c

C-c 属于前缀键,一般不能单独定义把

你的意思是 Emacs 对 C-c 有特殊处理吗?

主要是,C-c 在终端里(比如说 vterm-mode)很常用,所以想另外定义。我的理解是,前缀键只是 keymap 里再套一层 keymap,如果 C-c 有特殊处理那就另说了。

我帮你把标题改了。标题一定要清晰简明、言之有物。

你不应该修改 C-c 的绑定,这是一个广泛约定俗成的前缀按键。所以即使你修改了,被覆盖是毫无悬念的。

自定义按键可以放在 C-c 之下,比如 C-c C-c

另外你说绑定的 vterm--self-insert 我猜你的意思是发送中断消息 vterm-send-C-c

不是 C-c 有特殊处理,正相反因为没有特殊处理,而且大部分 map 的 C-c 都是前缀,把你自定义的 C-c 覆盖了是正常现象。