Beschreibung
Das Standardverhalten beim Aufrufen von emacsclient ist etwas konservativ. Schauen Sie sich diesen Kommentar von
emacsclient.c an :
/* Unless we are certain we don't want to occupy the tty, send our
tty information to Emacs. For example, in daemon mode Emacs may
need to occupy this tty if no other frame is available. */
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, warum emacsclient -n -a '' FILE
nicht das erfüllt wird, wonach Sie suchen, wenn kein Server ausgeführt wird.
- Die
-a ''
Logik startet einen Daemon.
- Dann
emacsclient
sagt ihn einen neuen Terminal Rahmen zu schaffen, denn das ist die Standardeinstellung ist , wenn Sie elisp sind zu bewerten.
- Die
-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 :
(defadvice server-process-filter (before prefer-graphical activate)
;; STRING is a sequence of commands sent from emacsclient to the server.
(when (and
;; Check that we're editing a file, as opposed to evaluating elisp.
(string-match "-file" string)
;; Check that there are no frames beyond the Emacs daemon's terminal.
(daemonp)
(null (cdr (frame-list)))
(eq (selected-frame) terminal-frame)
;; Check that we have a graphical display.
;; `display-graphic-p' doesn't work here.
(getenv "DISPLAY"))
(setq string (concat
;; STRING must be all one line, but comes to us
;; newline-terminated. Strip off the trailing newline.
(replace-regexp-in-string "\n$" "" string)
;; Add the commands to create a graphical frame.
"-window-system "
"-display " (getenv "DISPLAY")
;; Add back the newline.
"\n"))))
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
#!/bin/bash
emacs --eval '(server-start)' $* &
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.
- Der Terminalrahmen des Dämons hängt herum. Befehle wie
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.
- Das Shell-Skript ist sehr einfach.
- Das Kommunikationsprotokoll von Emacs wird nicht empfohlen.
Fazit
Vielleicht gibt es einen Kompromiss? Dies ist das Beste, was ich mir vorstellen kann. Sie legen es als Ihren $ EDITOR fest.
#!/bin/sh
emacsclient -e "(frames-on-display-list \"${DISPLAY}\")" 1>/dev/null 2>/dev/null
if [ "$?" = "1" ]; then
emacsclient -c -n -a "" "$@"
else
emacsclient -n "$@"
fi
-a ''
Option "Emacs-Daemon starten und Emacsclient erneut versuchen" nicht verwenden möchten?