Das emacsclient
Programm erlaubt ein Flag --no-wait
(abgekürzt als -n
), das den Emacs-Server veranlasst, die angegebene Datei zu besuchen und sofort zurückzukehren.
emacsclient -n ~/.bashrc
Wenn ich einen alternativen Editor zur Verfügung stelle, funktioniert dies immer noch in Fällen, in denen kein Emacs-Server ausgeführt wird
emacsclient -n -a "/usr/local/bin/emacs" ~/.bashrc
Dies führt jedoch zu einem inkonsistenten Verhalten, da in Fällen, in denen der Server ausgeführt wird, dieser Aufruf sofort zurückgegeben wird. In Fällen, in denen kein Server ausgeführt wird und der alternative Editor verwendet wird, wird der Anruf zu einem blockierenden Anruf und wird erst zurückgegeben, wenn ich Emacs beende.
Gibt es eine Möglichkeit zu sagen emacs
(im Gegensatz zu emacsclient
), einen neuen Frame zu erstellen und dann zurückzukehren?
quelle
-a ''
Option "Emacs-Daemon starten und Emacsclient erneut versuchen" nicht verwenden möchten?-a ''
ein Daemon anstelle eines Servers gestartet. Dann wird versucht, ein Terminal- Emacs zu öffnen , aber da ich die-n
Option bereitgestellt habe , bleibt es nicht geöffnet. Es springt einfach zurück in die Schale.Antworten:
Beschreibung
Das Standardverhalten beim Aufrufen von emacsclient ist etwas konservativ. Schauen Sie sich diesen Kommentar von emacsclient.c an :
Aus Ihrer Beschreibung und Ihren Kommentaren geht hervor, dass Sie versuchen, den Emacs-Server bei Bedarf zu starten, während Sie gleichzeitig das
-n
Flag verwenden. Der Kommentar "zum Beispiel" hier lautet, warumemacsclient -n -a '' FILE
nicht das erfüllt wird, wonach Sie suchen, wenn kein Server ausgeführt wird.-a ''
Logik startet einen Daemon.emacsclient
sagt ihn einen neuen Terminal Rahmen zu schaffen, denn das ist die Standardeinstellung ist , wenn Sie elisp sind zu bewerten.-n
Logik beendet sofort diesen neuen Terminalrahmen.Wenn Sie Schritt 2 ändern könnten, um standardmäßig einen neuen grafischen Rahmen zu erstellen,
emacsclient -n -a '' FILE
würden Sie tun, was Sie wollen.Elisp-Lösung
Sie können Emacs veranlassen, standardmäßig einen neuen grafischen Rahmen zu erstellen, wenn Sie die Funktion
server-process-filter
wie folgt empfehlen :Fügen Sie das dann, wie gesagt, in Ihre Init-Datei ein,
emacsclient -n -a '' FILE
und Bob ist Ihr Onkel.Vergleiche mit Shell Solution
Einerseits kann ich auf einige Vorteile der Verwendung dieses Defadvice-Ansatzes im Vergleich zur Verwendung des von Archenoth vorgeschlagenen Skripts hinweisen
als alternativer Editor. Mit dem defadvice:
save-buffers-kill-terminal
(C-x C-c
standardmäßig) verhält sich über alle Frames hinweg konsistent. Der Emacs-Prozess wird nie abgebrochen, da jeder Frame immer ein Client-Frame ist.find-grep
diese, die an externe Prozesse gesendet werden, verhalten sich besser, wenn das dumme Terminal vorhanden ist. Zumindest habe ich weniger Kopfschmerzen, die mit dem Entweichen der Muschel zusammenhängen.Auf der anderen Seite ... ja.
Fazit
Vielleicht gibt es einen Kompromiss? Dies ist das Beste, was ich mir vorstellen kann. Sie legen es als Ihren $ EDITOR fest.
quelle
Ich bin mir nicht sicher, wie ich das innerhalb von Emacs machen soll, aber zum Glück gibt es andere Möglichkeiten, um das zu bekommen, was Sie beschreiben.
Wenn Sie nichts
.emacs
zum Starten eines Servers haben, können Sie jederzeit ein kleines Skript erstellen, das Emacs mit der Datei startet, die Sie bearbeiten möchten, und den Server gegabelt starten.Etwas wie:
Und dann gib das weiter
-a
.Allerdings ...
Wenn Sie den Server in Ihrem gestartet haben
.emacs
, müssen Sie kein Skript erstellen. Sie haben eine etwas knappere Option:Das kaufmännische Und unterstützt den Prozess und gibt Ihnen sofort Ihre Shell zurück, selbst wenn Emacs zum ersten Mal gestartet wird.
Möglicherweise müssen Sie
disown
den Vorgang ausführen, wenn Bash Jobs beim Beenden beendet. Wenn dies der Fall ist, fügen Siedisown
am Ende einfach ein hinzu :Unter Windows wäre das nächste Äquivalent der
start
Befehl " " ...Wie im obigen Skriptvorschlag müssten Sie wahrscheinlich eine Batchdatei erstellen, die Folgendes enthält:
Und dann das
-a
Argument darauf richten.Das sollte die Batch-Datei ausführen und sofort nach dem Start von Emacs mit der entsprechenden Datei zurückkehren.
quelle
&
war das erste, was ich versuchte. Leider wird der folgende Text an gesendetstderr
: und dann die Klemmenblöcke, die auf das Ende des Prozesses warten:emacsclient: can't find socket; have you started the server? To start the server in Emacs, type "M-x server-start".
Ich vermute, dass dieemacsclient
Gabeln in den Hintergrund treten, aber dann wird aufgerufen,emacs
was im Vordergrund geöffnet wird.emacs --eval '(server-start)' $* &
vielleicht? Auf diese Weise wird der Server gestartet, Sie erhalten Ihr Terminal undemacsclient
verfügen über einen Server , mit dem eine Verbindung hergestellt werden kann.emacs
den normalen Weg liefen . Mir wird klar, dass die meisten Leute diese Konfiguration wahrscheinlich nicht haben würden, also ist das jetzt der erste Teil der Antwort. Ich hoffe es hilft..!