Frage

Szenario:

  • Ich fange M-x geben Sie einen Befehl eingeben
  • Ich schalte auf einen anderen Emacs Fenster / Puffer, weil ich ich die Ausführung des Befehls im falschen Fenster
  • realisieren
  • Ich fange wieder M-x geben Sie den Befehl in dem richtigen Fenster ausführen

Ergebnis: Ich bekomme die gefürchtete „Befehl versucht Minipuffer zu verwenden, während in Minipuffer“

Das passiert mir täglich mehrere Male während Emacs verwenden, und nicht nur in diesem Szenario. Dieses Verhalten ist sehr benutzerfeindlich (ref. Modi und Pseudo-Modi in The Humane Interface von Jef Raskin)

Gibt es eine Möglichkeit Emacs Verhalten anzupassen, so dass stattdessen diesen Fehler geben, es bricht gerade den ersten Minipuffer und ersetzt sie durch einen neuen?

War es hilfreich?

Lösung

Tatsächlich dieses Emacs „Feature“ ist aggressiv und lästig. Ich fand dies die richtige Antwort auf das Problem sein .Die meist wahrscheinlich, dass Sie Fokus des Minipuffers verloren, weil Sie Fenster mit der Maus und nicht ein Minipuffer Befehl geschaltet. Also, wenn Sie Fokus mit der Maus verlieren, wird der Minipuffer gelöscht werden. Überprüfen Sie diesen Beitrag. Es funktioniert für mich und es ist viel besser als rekursive minibuffers die Kopfschmerzen verursachen

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

Andere Tipps

Sie können die Variable enable-recursive-minibuffers gesetzt, die aus kommen, dass die Fehlermeldung verhindern. Aber es ermöglicht nur mehrere Anrufe an den Minipuffer - es spielt umleiten nicht den Befehl des aktuellen Minipuffer zu den neuen Puffer. Sie können dies einen Versuch geben, aber ich denke, es wird mehr verwirrend sein, weil die ursprüngliche Aktion noch aussteht ...

M-x an 'execute-extended-command gebunden und Wieder Hosting für diesen Befehl (den ursprünglichen Pufferwechsel) ist eine Art, wie die Programmierung mit Fortsetzung. das heißt Sie ein Unterprogramm von Ort X nennen, sondern zu X zurückzukehren, wenn Sie fertig, kehren Sie auf Y. ich persönlich denke, es mehr Verwirrung eröffnen würde, als es lösen würde. Aber ich verstehe die Frustration (und kenne andere, die die gleiche Frustration haben).

Ich bin mir nicht sicher, ob es eine solche Anpassung ist, aber der Weg, dies ich vermeiden schlägt ctrl - g den Befehl abzubrechen Ich war in der Mitte von Schreiben in dem Minipuffer.

Da meine erste Antwort nicht direkt Sie, was Sie wollen, ich dachte, ich würde mit einer echten Lösung. Das ist, was ich habe:

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

Ich habe es auf diese Weise getestet. Ich band es zu einem Schlüssel (F10 in meinem Fall b / c Ich wollte nicht M-x verlieren). Dann mit zwei offenen Fenstern, die jeweils einen anderen Puffer zeigt (etwa A und B):

  1. Fenster zeigt Puffer A: F10 isearch-for
  2. Wechsel von Minipuffer zu Fenster zeigen A: C-x o
  3. Wechseln Sie vom Fenster A dieser zeigt B zeigt: C-x o
  4. "re-host" der Befehl aus dem Puffer B: F10
  5. Geben Sie nun in dem Minipuffer zurück, den Befehl ward RET beenden

Als ich anfing, einen Suchbegriff eingeben, die Suche B Puffer angelegt wird.

Dies ersetzt nur die M-x Funktionalität, nicht die Befehle von M-x aufgerufen. Auch dann, wenn diese Version nicht das Präfix Argument unterstützen.

Hoffentlich ist das, was Sie wollen.

Kann mir jemand auf der folgenden verbessern?

Ich habe aufgegeben und will nur \ C-w setzen alle vorherigen Minipuffer zu löschen, bevor eine neue (wie tun \ C-g \ C-w)

Öffnen

Bisher dank Trey ich habe:

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

Welcher Befehl soll ich an der Stelle von exit-minibuffer verwende oben?

Ich habe versucht,

keyboard-escape-quit
exit-minibuffer
keyboard-quit

Hier gehen Sie:

;; 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)
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top