![是否可以让 ESC 充当实际的退出键?](https://linux22.com/image/1384923/%E6%98%AF%E5%90%A6%E5%8F%AF%E4%BB%A5%E8%AE%A9%20ESC%20%E5%85%85%E5%BD%93%E5%AE%9E%E9%99%85%E7%9A%84%E9%80%80%E5%87%BA%E9%94%AE%EF%BC%9F.png)
所以我最终转而使用 Emacs,并不是因为我确信它本身就是更好的编辑器,而是因为它确实有更强大的扩展。我仍在使用vim 模式不过,这也许是我的问题的一部分……但我真的不打算放弃模式方法,所以我可能会坚持下去。
我感觉还不错,但有一件事让我很不安,那就是按键的行为esc(我所处的shift-lock位置)。我习惯于依赖它,或多或少把它当作一个“紧急键”,这可能不太好,但我发现它让我在工作时不必太在意按键本身,因此速度更快。
我希望这个键能让我退出任何迷你缓冲区或特殊编辑模式,进入明确定义的正常状态。也许最重要的是,我希望它不是做任何不相关的事情,
- 模拟meta。我有alt钥匙做什么?
- 关闭当时我不在的窗户。
- 被解释为某些键序列中的最后一个键。
- ...
是否可以关闭所有这些并制作esc一个实际的退出键? Vim 模式确实在某些情况下使它表现得像我喜欢的那样,但特别是当涉及其他插件时,这通常会中断。
或者,是否有不同的选项可能适合我的工作流程?
答案1
您正在寻找的行为体现在 Emacs Lisp 函数中keyboard-quit
,默认情况下绑定到C-g
(Control-g)。在 Emacs 上下文中,它的行为大致相当于C-c
shell 中的通常函数;它将中断正在运行的任何 Lisp 代码,并将您带回顶层。(特别是,如果您被提示在迷你缓冲区中输入文本,并且决定您不想执行提示您的任何操作,则可以使用 Cg 取消它。)
默认情况下,按一次 Escape 键可充当 Meta 前缀键;也就是说,涉及 Meta 键的键绑定(例如M-x
、execute-extended-command
)在按 Alt-x 或按 Escape 然后按 X 时同样有效 - Emacs 不会区分。按三次 Escape 键将运行keyboard-escape-quit
,这很像keyboard-quit
但更像“按我的意思做”的行为 - 这是我使用 Emacs 几年来从未需要过的东西,而且直到几分钟前我才知道,但您可能会发现它很有用。
说到你可能会觉得有用的东西:你可以通过 函数获取任何 Emacs 函数的文档describe-function
,调用方式为C-h f FUNCTION-NAME RET
(即按下并释放 Control-h,按 f,在提示符下输入函数名称,按 Return),或M-x describe-function RET FUNCTION-NAME RET
。对于变量,它是相同的,除了C-h v
或describe-variable
,加上变量名称;对于击键,它是C-h k
或describe-key
,然后输入要描述其绑定的键和弦。这三个函数,加上C-h m
检索当前缓冲区的主要和次要模式的文档,对于发现 Emacs 的工作原理及其功能非常有用,我热情地向您推荐它们,因为它们是减少 Emacs 看起来陌生和令人生畏的程度的最佳和最快方法。
现在,终于可以回答您的实际问题了:也许可以重新配置 Emacs 的默认键映射,以便区分 Esc 键和 Meta 键。但是,出于以下几个原因,我并不建议您尝试这样做。
首先,虽然我确信有办法做到这一点,但它必然会很晦涩和棘手,并且很有可能以不明显的方式出错——虽然这对于 Emacs 老手来说没问题,但当您尝试学习编辑器时,这并不可取。更糟糕的是,如果您尝试以幼稚和明显的方式(例如M-: (global-set-key (kbd "ESC") 'keyboard-quit) RET
)来做到这一点,您将完全破坏 Meta 键的行为。实际上,要使其正常工作,需要深入到 Emacs 输入事件处理的最低级别——戴上头灯,带上砍刀,并打包午餐。(也许是两顿午餐。)
其次,即使您可以让该绑定可靠地工作,它也是非常非标准的,而您在任何地方使用的任何 Emacs 都肯定会C-g
绑定到keyboard-quit
。特别是在学习编辑器时,建议您尽可能熟悉默认的键绑定,而不是以仅适用于您自己的 Emacs 初始化文件的方式重新绑定。(如果您可以保证您永远不会在自己的机器以外的任何地方使用 Emacs,或者您始终能够安装您的初始化文件,那就太好了!去做吧。此外,出于这个目的,Emacs 标准库中的 Vim 模式算作“默认”,因为您可以通过M-x vim-mode RET
或类似方式在任何正确安装的 Emacs 上调用它。)
tl;dr:您可能可以使用 ESC 来做到这一点,但是如果完全有可能的话,这需要可怕的黑客技术才能做到这一点,并且您最好习惯 Emacs 默认提供的调用您想要的行为的功能。
答案2
您可以在 Emacs 初始化文件中使用它:
;;; esc always quits
(define-key minibuffer-local-map [escape] 'minibuffer-keyboard-quit)
(define-key minibuffer-local-ns-map [escape] 'minibuffer-keyboard-quit)
(define-key minibuffer-local-completion-map [escape] 'minibuffer-keyboard-quit)
(define-key minibuffer-local-must-match-map [escape] 'minibuffer-keyboard-quit)
(define-key minibuffer-local-isearch-map [escape] 'minibuffer-keyboard-quit)
(global-set-key [escape] 'keyboard-quit)