无法在 emacs 中重新绑定 C-M-q

Can't rebind C-M-q in emacs

我正在尝试设置一些自定义绑定,但 运行 遇到了一个令人费解的问题,我无法重新绑定 C-M-q 或完全取消绑定。我重新绑定其他键没有问题,所以我不知道 C-M-q 有什么特别之处。以下是我在 .emacs 文件中尝试过的一些内容。

;;(global-set-key (kbd "C-M-q") nil)
;;(global-unset-key (kbd "C-M-q"))
;;(global-set-key (kbd "C-M-q") 'shrink-window-horizontally)
(global-set-key (kbd "C-M-y") 'shrink-window-horizontally)
(global-set-key (kbd "C-M-w") 'shrink-window)
(global-set-key (kbd "C-M-e") 'enlarge-window)
(global-set-key (kbd "C-M-r") 'enlarge-window-horizontally)

无论我尝试什么,C-h k 命令都说 C-M-q 绑定到

C-M-q runs the command indent-pp-sexp, which is an interactive compiled Lisp function in `lisp-mode.el'.

It is bound to C-M-q.

global 键映射是最低优先级的键映射,而此绑定位于缓冲区的 local(主要模式)键映射中您正在查看(这是一个 lisp 缓冲区),因此 Emacs 永远不会看到您的全局键盘映射发生变化,因为它在到达那一步之前已经找到了绑定。

具体来说,此绑定位于 lisp-mode-shared-map(几种 lisp 模式的父键映射)中,它隐藏了 prog-mode-map 中更通用的绑定。其他编程模式对此键有自己的绑定,以确保它始终具有某种 "indent expression" 行为。

因此,我会建议您不要破坏此绑定,因为它有标准用途。如果你真的想要这样做,那么你应该看看Globally override key binding in Emacs

Emacs 有很多层的键盘映射,了解系统的工作原理很重要,因此我强烈建议您花时间阅读以下有关该主题的文章:

https://www.masteringemacs.org/article/mastering-key-bindings-emacs