Wie verwende ich emacsclient als EDITOR oder VISUAL?

10

Szenario: Ich bin in zsh und möchte einen langen Shell-Befehl in einer bereits geöffneten Instanz von Emacs bearbeiten. Ich habe festgelegt $VISUALzu emacsclient -n -c. Wenn ich C-x C-evon zsh aus laufe , wird ein neuer Emacs-Frame geöffnet, der mit Inhalten der zsh-Zeile gefüllt ist. Nachdem ich den Puffer bearbeitet und gespeichert habe, drücke ich C-x kund der Puffer wird geschlossen. Die zsh-Linie bleibt unverändert . Warum erkennt zsh die in Emacs vorgenommenen Änderungen nicht?

Emacs 24.5.1, zsh 5.0.8, Mac OS X 10.10.4

cg433n
quelle

Antworten:

11

Stellen Sie VISUALauf emacsclient -c(oder eine andere Variante ohne -n).

Die Option -nbewirkt emacsclient, dass sie zurückgegeben wird, sobald sie die laufende Emacs-Instanz kontaktiert, um sie anzuweisen, die Datei zu bearbeiten. Das Programm, das den Editor aufruft (hier zsh, dies gilt jedoch auch für alle anderen $VISUALaufgerufenen Programme ), weiß, dass Sie die Bearbeitung abgeschlossen haben, da das aufgerufene Programm beendet wurde -n, was im Wesentlichen sofort geschieht.

Sie müssen dafür sorgen, dass das aufgerufene Programm VISUALbeendet wird, wenn Sie die Bearbeitung abgeschlossen haben, dh wenn Sie den Puffer in Emacs schließen. Genau das ist emacsclientohne -n: Es kontaktiert die laufende Emacs-Instanz, um sie anzuweisen, die Datei zu öffnen, und sitzt dann herum, bis Emacs antwortet, um emacsclient mitzuteilen, dass die Bearbeitungssitzung beendet ist. Der normale Weg, um eine Bearbeitungssitzung zu beenden, ist das Drücken von C-x #( server-edit). Dies benachrichtigt emacsclient und schließt den Puffer sowie den Frame, wenn er von geöffnet wurde emacsclient -c. Durch das Schließen des Puffers wird auch der Emacsclient-Prozess benachrichtigt, dass die Sitzung beendet ist. Sie erhalten jedoch eine Warnmeldung („Puffer… hat noch Clients, töten Sie ihn?“), Die Sie durch Überschreiben der Funktion deaktivieren können server-kill-buffer-query-function(RMS hält dies für gefährlich). In einem Rahmen geöffnet vonemacsclient -cDurch Drücken von C-x C-c( save-buffers-kill-terminal) wird die Datei gespeichert, geschlossen und der Frame geschlossen.

Gilles 'SO - hör auf böse zu sein'
quelle
-nverhindert auch, dass emacsclient als Editor für git arbeitet.
cg433n
Eine Tangente (und ich werde sie in eine andere Frage stellen, wenn Sie wollen), aber welchen Nutzen hat die -nFlagge?
Tintenfisch
3
@ MrBones Angenommen, ich bin in einem Dateimanager oder in der Befehlszeile und möchte eine Datei bearbeiten. Nicht „eine Datei bearbeiten und dann etwas damit machen“, sondern einfach mit der Bearbeitung beginnen. Wenn ich eine separate Instanz von Emacs pro Datei ausführen würde, würde ich emacs myfile &(oder das Windows-Äquivalent) ausführen und den Emacs-Prozess in den Hintergrund stellen. Mit emacsclient könnte ich laufen emacsclient myfile &, aber das lässt einen emacsclientProzess übrig, dessen einzige Aufgabe darin besteht, zu warten und dann zu beenden. Stattdessen emacsclient -n myfilerenne ich , sodass der Emacsclient-Prozess von selbst verschwindet. Dies ist so häufig, dass ich einen Shell-Alias ​​dafür habe:alias e='emacsclient -n'
Gilles 'SO - hör auf böse zu sein'
@ Gilles Mir wurde klar, dass ich immer nur emacsclientim Terminal renne , weshalb ich den Sinn von nicht sehen konnte -n. Vielen Dank
Squidly
2
@ MrBones, ich würde sagen, dass das Ausführen von emacsclient in einem Terminal der genaue Grund für die Verwendung von -n ist: Nach dem Öffnen des Sendens der Datei an den geöffneten Emacs-Frame wird emacsclient beendet und man kann weiterhin im Terminal arbeiten. Das ist außergewöhnlich praktisch.
Daniel