Ausführen von emacsclient mit einem Skript

Ausführen von emacsclient mit einem Skript

Ich versuche, ein Skript zu erstellen, um zu bestimmen, ob emacsclientes mit -ncoder 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 emacsInstanz. 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-commitweiter ausgeführt.C-x C-c
  • Öffnet bei Aufruf ohne Datei ein GUI-Fenster (verhält sich wie ein einfacher emacsAufruf; wenn ich dies mache, emacsclientwird mir angezeigt, dass eine Eingabedatei erforderlich ist) und kehrt sofort zurück.

Antwort1

Dieses Skript aus dem Arch Wiki

Dieser Aufruf emacsdieser 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 emacsclientsofort 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, emacsclientdass 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 emacsclientOption (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 emacsProgramm 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.

verwandte Informationen