14

シナリオ:

  • コマンドを入力するためにMxと入力し始めます
  • 間違ったウィンドウでコマンドを実行していることに気付いたので、別のemacsウィンドウ/バッファーに切り替えました
  • 正しいウィンドウでコマンドを実行するために、もう一度Mxと入力し始めます

結果:「コマンドがミニバッファー内でミニバッファーを使用しようとしました」という恐ろしい結果が表示されます

これは、このシナリオだけでなく、emacsを使用しているときに1日に複数回発生します。The Humane Interfaceこの動作は非常にユーザーに敵対的です( Jef Raskinによるモードと疑似モードを参照)

このエラーを出す代わりに、最初のミニバッファーをキャンセルして新しいミニバッファーに置き換えるように、emacsの動作をカスタマイズする方法はありますか?

4

6 に答える 6

6

実際、この emacs の「機能」は攻撃的で煩わしいものです。これが問題に対する正しい答えであることがわかりました。ほとんどの場合、ミニバッファー コマンドではなくマウスでウィンドウを切り替えたため、ミニバッファーのフォーカスが失われました。そのため、マウスを使用してフォーカスを失うたびに、ミニバッファーがクリアされます。この投稿を確認してください。それは私にとってはうまくいき、頭痛の原因となる再帰的なミニバッファよりもはるかに優れています

http://trey-jackson.blogspot.com/2010/04/emacs-tip-36-abort-minibuffer-when.html

于 2011-10-25T21:28:44.150 に答える
5

そのようなカスタマイズがあるかどうかはわかりませんが、これを回避する方法は、ミニバッファーに書き込んでいる途中のコマンドをキャンセルすることですctrlg

于 2009-05-01T16:41:18.037 に答える
4

私の最初の答えはあなたが望むものを直接あなたに与えないので、私は本当の解決策を思いつくだろうと思いました。これは私が持っているものです:

(defvar my-execute-extended-command-source-buffer nil
  "var holding the buffer to which the extended-execute-command should apply")
(defvar in-my-execute-extended-command nil
  "internal use - indicates whether we're in a 'recursive edit' of sorts")
(defun my-execute-extended-command (command)
  "home-grown version of execute-extended-command that supports re-hosting the buffer"
  (interactive (list (if in-my-execute-extended-command
                   nil
                 (let ((in-my-execute-extended-command t))
                   (setq my-execute-extended-command-source-buffer (current-buffer))
                   (completing-read "My-x " obarray 'commandp t nil 'extended-command-history nil nil)))))
  (if in-my-execute-extended-command
      (progn (setq my-execute-extended-command-source-buffer (current-buffer))
             (select-window (minibuffer-window)))
    (switch-to-buffer my-execute-extended-command-source-buffer)
    (call-interactively (symbol-function (intern command)))))

私はそれをこのようにテストしました。私はそれをキーにバインドしました(F10私の場合はb / cを失いたくありませんでしたM-x)。次に、2つのウィンドウを開いて、それぞれが異なるバッファー(AとBなど)を表示します。

  1. バッファAを表示しているウィンドウから:F10 isearch-for
  2. ミニバッファからAを表示するウィンドウに切り替えます。C-x o
  3. Aを表示しているウィンドウからBを表示しているウィンドウに切り替えます。C-x o
  4. バッファBからコマンドを「再ホスト」します。F10
  5. ミニバッファに戻り、コマンドを終了しますward RET

検索語の入力を開始すると、検索はバッファーBに適用されました。

これはM-x機能を置き換えるだけで、から呼び出されるコマンドは置き換えませんM-x。また、このバージョンはプレフィックス引数をサポートしていません。

うまくいけば、これはあなたが望むものです。

于 2009-05-01T18:39:05.163 に答える
2

誰かが次のことを改善できますか?

私はあきらめて、新しいミニバッファを開く前に以前のミニバッファをキャンセルするように\ Cwを設定したいだけです(\ Cg \ Cwを実行するように)

これまでのところ、Treyのおかげで私は次のようになりました。

(defun cancel-completing-read ()
  (if (> (minibuffer-depth) 0) (exit-minibuffer))
   (completing-read "My-x " obarray 'commandp t nil 'extended-command-history nil nil))

(defun cancel-and-execute-command (command)
  (interactive (list (cancel-completing-read)))
  (call-interactively (symbol-function (intern command))))

(global-set-key "\M-x" 'cancel-and-execute-command)

上記の代わりにどのコマンドを使用すればよいexit-minibufferですか?

私はもう試した

keyboard-escape-quit
exit-minibuffer
keyboard-quit
于 2009-05-04T13:30:57.143 に答える
2

どうぞ:

;; automatically cancel the minibuffer when you switch to it, to avoid
;; "attempted to use minibuffer" error.
;; cy was here

(provide 'cancel-minibuffer)

(defun cancel-minibuffer-first (sub-read &rest args)
    (let ((active (active-minibuffer-window)))
        (if active
                (progn
                    ;; we have to trampoline, since we're IN the minibuffer right now.
                    (apply 'run-at-time 0 nil sub-read args)
                    (abort-recursive-edit))
            (apply sub-read args))))

(advice-add 'read-from-minibuffer :around #'cancel-minibuffer-first)
于 2016-09-24T03:36:30.763 に答える