遇到一个关于键位绑定的问题无法理解,所以来向各位请教一下相关知识。
我在使用 vterm
时,在 vterm-mode-map
里定义 C-c
为 vterm--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-map
中 C-c
不知为何就不起作用了。
mob
2
可以用describe-key
(C-h k) + 按键 查看实际生效的函数。
很可能是被优先级更高的keymap给拦截了(可能就是meow)
用 describe-key
并输入 C-c
,它在等待后续输入,应该是 fallback 到全局绑定了。前面用 describe-binding
检查时也留意过,其它 keymap 应该是没有关于 C-c
的绑定。(meow
没有覆盖 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 覆盖了是正常现象。