Warum werden einige Befehle beendet, wenn der Minibuffer verlassen wird (isearch), während andere dies nicht tun (find-file)?

6

Gelegentlich beginne ich, eine Datei zu öffnen, und bevor ich die Datei aus irgendeinem Grund auswähle, führe ich sie aus, C-x obevor ich auf die Eingabeaufforderung antworte. Jedes Mal, wenn ich versuche, es find-fileerneut auszuführen , beschwert es sich über Command, das versucht hat, Minibuffer zu verwenden, während es sich im Minibuffer befindet . Wenn ich jedoch einen Befehl wie isearch-forward-regexp(auch wenn bereits in einer find-fileEingabeaufforderung) verwendet werde, wird der Fehler nicht ausgelöst und ich kann nicht mit zum Minibuffer zurückkehren other-window.
Warum aktualisieren einige Eingabeaufforderungen den Minibuffer vorübergehend, sodass other-windowder Minibuffer als mögliches Ziel betrachtet wird, andere nicht?


Nur zur Klarstellung, ich frage nicht, wie ich mich lösen soll.
Ursprünglich, als ich darauf stieß, wechselte ich zum Minibuffer und tat Esc Esc Escoder C-gum der Eingabeaufforderung zu entkommen, damit ich einen neuen Befehl initiieren konnte, der den Minibuffer verwendet. Beim Nachdenken über diese Frage wurde mir jedoch klar, dass abort-recursive-edit( C-]) diesen laufenden Minibuffer schließen wird, ohne other-window+ tun zu müssen keyboard-quit.

Trotzdem bin ich mir nicht ganz sicher, wofür der ursprüngliche Anwendungsfall ist. Vielleicht soll es beim Einfügen von Kopien in eine Minibuffer-Eingabeaufforderung helfen oder beim Ausführen eines Befehls mitten in einem Makro helfen?

Was ich tun möchte , ist wissen , ob es einen Weg gibt , dieses Rekursivität, wie es mit zu deaktivieren isearch. Ist isearchsicher, weil es ein Leseereignis anstelle einer blockierenden Eingabeaufforderung verwendet? Gibt es einen Hook, der abort-recursive-editbeim Verlassen des Minibuffers ausgelöst werden muss?


TL; DR

  1. Warum aktualisieren einige Minibuffer-Befehle den Minibuffer auf ein Ziel für other-windowund blockieren die Ausführung neuer Minibuffer-Befehle, während andere, z isearch.
  2. Gibt es eine Möglichkeit, dies zu deaktivieren?
  3. Was ist der beabsichtigte Anwendungsfall dieser Funktion?
dgtized
quelle
2
Ihre Frage ist mir unklar. Was versuchst du zu tun? C-]bricht eine Ebene des Minibuffers ab, ja. Isearch verwendet den Minibuffer nicht. Und was hat " in prompt stecken " mit dem Rest von dem zu tun, was Sie beschreiben? Sie sollten switch-windowin solchen Kontexten überhaupt nicht verwenden müssen . Aber es ist nicht klar, was Sie versuchen zu tun. Versuchen Sie, die verschiedenen Teile Ihrer Beschreibung zu trennen, und versuchen Sie, eine einzige Frage zu stellen.
Drew
2
Versuchen Sie die Einstellung, enable-recursive-minibuffersum tzu vermeiden, dass der Befehl versucht, den Minibuffer in der Minibuffer- Nachricht zu verwenden. Es kann hilfreich sein, die ursprüngliche Frage zu klären, wenn Sie die Frage recursive-editseparat veröffentlicht haben.
Vamsi

Antworten:

5
  1. Viele interaktive Befehle lesen die Minibuffer-Eingabe. find-fileist ein solcher Befehl. Das Lesen der Minibuffer-Eingabe "aktiviert" das Minibuffer-Fenster, weshalb Sie mit dem other-windowBefehl dorthin wechseln können . Interaktiv isearchist etwas Besonderes, da es als Nebenmodus implementiert ist. Es liest Ihre Suchzeichenfolge technisch nicht aus dem Minipuffer, sondern fängt Ihre Tastendrücke während der Eingabe ab und gibt sie mit an den Minipuffer weiter message. Deshalb sehen Sie ein other-windowanderes Verhalten.
  2. Dies kann Ihnen helfen oder auch nicht, aber technisch können Sie das Eingabeaufforderungsverhalten von ändern, find-fileindem Sie die in gespeicherte Funktion ändern read-file-name-function. Ich habe nicht versucht, die Funktion basierend auf der Antwort von @ kaushalmodi zu empfehlen, aber wenn das funktioniert, werde ich dies aktualisieren.
  3. Ich kann nicht für einen der Hacker sprechen, die an dem Code in minibuffer.el gearbeitet haben, aber anhand der folgenden Beschreibung im Handbuch würde ich vermuten, dass das Verhalten so konzipiert ist, dass Sie Text töten und reißen können:

Wenn der Minibuffer aktiv ist, wird der Echo-Bereich wie ein gewöhnliches Emacs-Fenster behandelt. Sie können beispielsweise zu einem anderen Fenster wechseln (mit Cx o), dort Text bearbeiten und dann zum Minibuffer-Fenster zurückkehren, um das Argument zu beenden. Sie können sogar Text in einem anderen Fenster beenden, zum Minibuffer-Fenster zurückkehren und den Text in das Argument ziehen.

lila_Pfeile
quelle
2

Das folgende Snippet [ Quelle ] bricht die rekursive Bearbeitung ab, wenn sich der Fokus vom Minibuffer entfernt. Dies dient dazu, irritierende Situationen zu vermeiden, in denen durch wiederholtes C-gDrücken der Minipuffer nicht bearbeitet wird, da sich der Cursorfokus herausbewegt hat.

(defun stop-using-minibuffer ()
  "töte den Minibuffer"
  (wenn (und (> = (Rekursionstiefe) 1) (aktives Minibuffer-Fenster))
    (abort-recursive-edit)))
(Add-Hook 'Mouse-Leave-Buffer-Hook' Stop-Using-Minibuffer)
Kaushal Modi
quelle
1

Drew hat dies bereits kommentiert, aber ...

isearch1 eigentlich nicht die Minipuffer verwenden, die wahrscheinlich für einen Teil Ihrer Verwirrung ausmacht. Es werden Dinge im Echo-Bereich angezeigt (der sich im selben Fenster wie der Minibuffer befindet, aber nicht der Minibuffer ist).

In diesem Fall macht der Gedanke, während einer Isearch zum und vom Minibuffer zu wechseln, keinen Sinn.

1 Ignorieren Befehle wie isearch-edit-stringdie zu tun , die Minipuffer verwenden, sind aber nicht Teil der grundlegendsten isearch Workflow.

Phils
quelle