Emacs:除非键具有特殊含义,否则全局键重新绑定

Emacs: global key rebinding unless the key has a special meaning

我想全局更改 Emacs 中键的通常绑定。例如,Return 运行默认是命令newline,我希望它是运行 electric-newline-and-maybe-indent反而。我目前执行

(local-set-key [return] 'electric-newline-and-maybe-indent)

通过 find-file-hooks 函数。不幸的是,这会破坏某些模式,例如 po-mode,其中 Return 具有特殊含义。我想知道一些干净的方法来重新绑定,这样特殊的含义就不会受到影响。特别是,我不想列出具体的模式,因为我可能事先不知道它们。

我认为在这个例子中,只有当绑定到 Return 的初始命令是 newline 时才重新绑定可能是一个解决方案。但如何做到这一点?或者有更好的解决方案吗?

简单:

(global-set-key [return] 'electric-newline-and-maybe-indent)

所有想要覆盖 RET 的次要模式仍然可以做到。

更新

好的,我想我在这里看到了问题:

(global-set-key (kbd "RET") 'electric-newline-and-maybe-indent)

不确定 [return] 是否有效,因为我总是使用 kbd。只是不要使用 [return].

我终于找到了一个解决方案,它似乎适用于我提到的所有情况(不影响 po-mode):

(substitute-key-definition 'newline 'electric-newline-and-maybe-indent global-map)

我是通过阅读 subr.el 文件找到的。

但是,根据文档,如果将不同的键绑定到 newline,这可能会产生不需要的副作用,因为所有键都会受到重新绑定的影响。否则某些绑定稍后可能会被覆盖。