15

EDIT:キーボード終了(通常はCgにバインドされています)があることを理解しています。しかし、Emacs に付属する編集機能 (この場合のように) をどのように扱うかについて知りたいと思っています。いくつかの組み込み関数を少しだけ変更したいときに、この種の状況に時々遭遇します。

emacs では M-ESC ESC を (または ESC を 3 回) 押すと、transient-mark などの多くの状況から抜け出すことができます。意図したよりも多くのエスケープ キー) が発生し、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 ファイルにコピーして、そこで変更を行う。どちらの方法もあまり良くありません。理想的には、私は批判の線で何かを見たいと思っていますが、この場合はどうすればよいかわかりません。

4

6 に答える 6

15

アラウンドアドバイスを使用して、問題のある関数を再定義して、必要なことを実行できます(つまり、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)))))

この種の機能は(let ...)のように機能しますが、変数ではなく限定されたスコープの関数をオーバーライドする必要があるため、より複雑にする必要があります。

于 2009-02-17T19:56:34.993 に答える
5

ウィンドウを閉じる前に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 では不満です。まだデバッグを気にしていません。)

于 2016-11-02T21:33:22.627 に答える
1

デフォルトでは、Escape キーを 1 回押すと、Meta プレフィックス キーとして機能します。つまり、Meta キーを含むキーバインドです。

Escape キーを 3 回押すと、keyboard-quit に似ていますが、より「do what I mean」動作を伴う、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)
于 2015-07-25T17:11:12.633 に答える