在Emacs中,键盘逃脱的最佳方法是什么,不要破坏其他窗口?

时间:2009-02-17 15:15:03

标签: emacs elisp dot-emacs

编辑:我知道键盘退出(通常与C-g绑定);但我更感兴趣的是如何处理Emacs附带的编辑功能(就像在这种情况下)。当我想要改变一些内置函数时,我经常遇到这种情况。

在emacs中,当你按下M-ESC ESC(或ESC三次)时,你可以摆脱很多情况,比如瞬态标记等。但我习惯性地点击了逃生键(我实际上将其重新映射为单击命中转义键)比我想要的更多,并最终杀死我的Windows配置,这是非常烦人的。函数keyboard-escape-quit在simple.el中定义:

(defun keyboard-escape-quit ()
  "Exit the current \"mode\" (in a generalized sense of the word).
This command can exit an interactive command such as `query-replace',
can clear out a prefix argument or a region,
can get out of the minibuffer or other recursive edit,
cancel the use of the current buffer (for special-purpose buffers),
or go back to just one window (by deleting all but the selected window)."
  (interactive)
  (cond ((eq last-command 'mode-exited) nil)
    ((> (minibuffer-depth) 0)
     (abort-recursive-edit))
    (current-prefix-arg
     nil)
    ((and transient-mark-mode mark-active)
     (deactivate-mark))
    ((> (recursion-depth) 0)
     (exit-recursive-edit))
    (buffer-quit-function
     (funcall buffer-quit-function))
    ((not (one-window-p t))
     (delete-other-windows))
    ((string-match "^ \\*" (buffer-name (current-buffer)))
     (bury-buffer))))

我可以看到我不想要这些行:

    ((not (one-window-p t))
     (delete-other-windows))

但修改此功能的最佳方法是什么?我只能看到两种方式:1)修改simple.el 2)将此函数复制到我的.emacs文件并在那里进行修改。两种方式都不是;理想情况下,我希望在defadvice线上看到一些东西,但在这种情况下我无法看到我能做到的。

5 个答案:

答案 0 :(得分:15)

您可以使用around建议并重新定义违规函数以执行您想要的操作(即one-window-p应始终返回t):

(defadvice keyboard-escape-quit (around my-keyboard-escape-quit activate)
  (let (orig-one-window-p)
    (fset 'orig-one-window-p (symbol-function 'one-window-p))
    (fset 'one-window-p (lambda (&optional nomini all-frames) t))
    (unwind-protect
        ad-do-it
      (fset 'one-window-p (symbol-function 'orig-one-window-p)))))

这种行为类似于(让...),但必须更复杂,因为你需要覆盖有限范围的函数而不是变量。

答案 1 :(得分:7)

我经常发现'键盘退出(C-g)可以摆脱所有这些情况。

但是,如果您真的想拥有此功能的变体,我认为复制到.emacs文件(并重命名,我通常会使用bp的前缀)并在那里进行编辑可能是最好的选择。 / p>

编辑,以回应编辑:一般来说,每当我想要编辑版本的emacs功能时,我要么自己编写,要么将其复制到我的.emacs,重命名为bp-whotever,然后进行适当的编辑。 / p>

这方面的缺点是我的.emacs是巨大的,并且可能超常使用不再使用的古老功能...好处是每当我需要写一些新的东西时,我有大量的示例代码看看......

答案 2 :(得分:2)

这是另一个更简单的建议,它利用keyboard-escape-quit在关闭窗口之前调用buffer-quit-function的事实:

(defadvice keyboard-escape-quit
  (around keyboard-escape-quit-dont-close-windows activate)
  (let ((buffer-quit-function (lambda () ())))
    ad-do-it))

与Emacs 25.1一起使用。 (我最初使用@ scottfrazer的建议,但它在25.1中不满意.Haven还在调试。)

答案 3 :(得分:1)

默认情况下,单击Escape键即可充当Meta前缀键;也就是说,涉及Meta键的键绑定。

三次按Esc键将运行keyboard-escape-quit,这就像键盘退出,但更多的是"做我的意思"行为。

此代码可能对您的用例有所帮助。您可以在Emacs init文件中使用它:

;;; 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)

答案 4 :(得分:1)

  

我更感兴趣的是如何处理Emacs附带的编辑功能(就像在这种情况下一样)。当我想要改变一些内置函数时,我经常遇到这种情况。

这正是我创建库el-patch的目的。你可以把它放在你的init文件中:

crux