Ich versuche, ein Skript zu erstellen, um zu bestimmen, ob emacsclient
es mit -nc
oder ausgeführt werden soll -t
. Das Skript sieht so aus (basierend aufdiese Version):
#!/bin/sh
if [ -z "$DISPLAY" ]; then
IS_GRAPHICAL=true
else
IS_GRAPHICAL=$(emacs --batch -Q --eval='(if (fboundp '"'"'tool-bar-mode) (message "true") (message "false"))' 2>&1)
fi
if $IS_GRAPHICAL; then
emacsclient -a "" -nc "$@"
else
emacsclient -a "" -t "$@"
fi
Allerdings dauert die emacs --batch -Q ...
Zeile genauso lange wie die Verwendung einer nackten emacs
Instanz. Wenn ich diese Zeile auskommentiere, erhalte ich nichts statt eines leeren Bildschirms, wenn dies unter einem TTY ausgeführt wird. Ist es möglich, die Erkennung zu beschleunigen?
Ich habe bereits einen Emacs-Daemon mit einer systemd-Benutzereinheit gestartet. Ich möchte emacsclient
:
- bleibenim Terminal(das heißt, es wird kein GUI-Fenster geöffnet), wenn der Aufruf mit einer Datei erfolgt (z. B. aufgerufen durch ) oder wenn keine grafische Umgebung vorhanden ist (z. B. aufgerufen im TTY-Modus) und wird bis zum Beenden ( )
git-commit
weiter ausgeführt.C-x C-c
- Öffnet bei Aufruf ohne Datei ein GUI-Fenster (verhält sich wie ein einfacher
emacs
Aufruf; wenn ich dies mache,emacsclient
wird mir angezeigt, dass eine Eingabedatei erforderlich ist) und kehrt sofort zurück.
Antwort1
Dieses Skript aus dem Arch Wiki
Dieser Aufruf emacs
dieser Prüfungen (fboundp 'tool-bar-mode)
prüft, ob Ihr Emacs-Build GUI-Unterstützung enthält. Es ist möglich, Emacs ohne diese Funktion zu erstellen, um ein wenig RAM und Festplattenspeicher zu sparen¹, aber das ist ungewöhnlich. Wenn Sie nicht an der Kompatibilität mit Emacs-Builds ohne GUI-Unterstützung interessiert sind, vergessen Sie diesen Teil.
Sie haben also
if [ -n "$DISPLAY" ]; then
emacsclient -a "" -n -c "$@"
else
emacsclient -a "" "$@"
fi
Und selbst diese Komplexität ist nur dann erforderlich, wenn der Aufruf emacsclient
sofort zurückgegeben werden soll, wenn ein neues GUI-Fenster geöffnet wird. (Wenn es im Terminal ausgeführt wird, muss es so lange ausgeführt werden, bis Sie das Terminal nicht mehr verwenden.) Es liegt an Ihnen, ob Ihnen dieses Verhalten gefällt. Wenn nicht, können Sie einfach Folgendes ausführen:
emacsclient -a "" "$@"
Und wenn Sie Emacs sowieso mit Ihrer Sitzung starten, z. B. als systemd-Einheit, müssen Sie nicht angeben, emacsclient
dass er gestartet werden soll. Es bleibt also
emacsclient "$@"
was ich nicht weiter vereinfachen kann.
Ihr zusätzlicher Bedarf
- im Terminal bleiben (…), wenn es mit einer Datei aufgerufen wird (…) oder wenn keine grafische Umgebung vorhanden ist (…)
- öffne ein GUI-Fenster, wenn es ohne Datei aufgerufen wird (…) und kehre sofort zurück
Dazu müssen Sie testen, ob das Skript mit Argumenten aufgerufen wurde. Ich gehe davon aus, dass jede übergebene emacsclient
Option (z. B. --eval
) als Argument zählt.
if [ $# -ne 0 ]; then
emacsclient -nw "$@"
elif [ -n "$DISPLAY" ]; then
emacsclient -c -n
else
emacsclient -c
fi
¹ Keine GUI-Unterstützung bedeutet, dass Sie die erforderlichen Bibliotheken nicht installiert haben müssen. Das emacs
Programm kann nicht gestartet werden, wenn die benötigten Bibliotheken nicht vorhanden sind, selbst wenn es die GUI-Funktionen in dieser bestimmten Sitzung nicht verwenden wird.