Emacsclient: Ein einziger Emacs-Prozess die ganze Zeit vom Start an und niemals schließen und die Benutzeroberfläche besser ausblenden

9

Da emacsclient lange Ladezeiten von Paketen problemlos verarbeiten kann, möchte ich wirklich mindestens einen Emacs-Prozess und meistens nur einen Emacs-Prozess beibehalten, als Hintergrundprozess öffnen und die GUI besser ausblenden.

Im Moment habe ich die folgende Funktion in .bashrc definiert:

emc () 
{ 
    if [[ $# -eq 0 ]]; then
        emacs --eval "(suspend-frame)" &
        return
    fi
    args=($*);
    setsid emacsclient -c -e "(find-file \"${args[*]}\")"
}

Und haben Sie auch die folgende Zeile in .bashrc:

emc

Jedes Mal, wenn ich eine Shell öffne, habe ich einen neuen Emacs-Prozess.

Das Problem ist, dass ich nach dem Öffnen vieler Muscheln viele zusätzliche unnötige Emacs-Prozesse haben werde. Ich möchte jedoch immer nur einen einzigen Emacs-Prozess vom Start an beibehalten, um die GUI besser zu verbergen .

falsche Sammlerstücke
quelle
5
Ich bin nicht mit der Praxis vertraut emacs --eval "(suspend-frame)"statt emacs --daemon( emacswiki.org/emacs/EmacsAsDaemon ). Gibt es einen Grund, warum Sie Emacs nicht als Daemon aufrufen? Sie könnten so etwas verwenden, pgrep -U `whoami` emacs || emacs --daemon &um sicherzustellen, dass es ausgeführt wird.
Ebpa
Schauen Sie sich die Skripte von MJ Wall an, um den Emacs-Client zu verwenden.
Tianxiang Xiong

Antworten:

13

Ich starte dazu einen Emacs-Daemon, wenn ich mich anmelde. Wo Sie diesen Befehl eingeben, hängt von Ihrem Desktop-Manager ab. Ich verwende i3, das so konfiguriert ist, dass beim Anmelden ein Skript ausgeführt wird, das Folgendes enthält:

emacs --daemon &

Damit läuft emacs immer im Hintergrund, und ich öffne einen neuen Client mit emacsclient -c -n, gebunden an eine bequeme Tastenkombination im Fenstermanager. Wenn Sie in einem Terminal arbeiten, benötigen Sie nur eine einfache alias wie alias emc='emacsclient', möglicherweise mit -n, -coder -tArgumente, je nachdem , wie Sie es verwenden.

Überprüfen Sie die Optionen für emacsclient im Handbuch: ( (emacs) emacsclient-Optionen , auf die von Emacs aus zugegriffen werden kann C-h r m emacsclient options <enter>). Sie können das -aFlag verwenden, um einen Emacs-Daemon automatisch zu starten, wenn er noch nicht ausgeführt wird, -coder -tum einen neuen Frame oder Terminal-Client zu öffnen, anstatt einen vorhandenen (in derselben Sitzung) wiederzuverwenden:

'-Ein Kommando'
'--alternate-editor = BEFEHL'
     Geben Sie einen Befehl an, der ausgeführt werden soll, wenn 'emacsclient' Emacs nicht kontaktiert.
     Dies ist nützlich, wenn Sie 'emacsclient' in einem Skript ausführen.

     Als besondere Ausnahme gilt, wenn COMMAND die leere Zeichenfolge ist
     'emacsclient' startet Emacs im Daemon-Modus (als 'emacs --daemon') und
     versucht dann erneut, eine Verbindung herzustellen.

'-c'
'--create-frame'
     Erstellen Sie einen neuen grafischen „Client-Frame“, anstatt einen vorhandenen zu verwenden
     Emacs Rahmen. Siehe unten für das spezielle Verhalten von 'Cx C-c' in a
     Client-Frame. Wenn Emacs keinen neuen grafischen Rahmen erstellen kann (z.
     Wenn keine Verbindung zum X-Server hergestellt werden kann, wird versucht, einen Text zu erstellen
     Terminal-Client-Frame, als hätten Sie die Option '-t' angegeben
     stattdessen.

'-t'
'--tty'
'-nw'
     Erstellen Sie stattdessen einen neuen Client-Frame auf dem aktuellen Textterminal
     Verwenden eines vorhandenen Emacs-Rahmens. Dies verhält sich genauso wie das '-c'
     Option, oben beschrieben, außer dass ein Textterminal erstellt wird
     Rahmen (* Hinweis Nicht-Fenster-Terminals: :).
Tyler
quelle
4

Wenn Sie ein Betriebssystem verwenden, das den systemd Service Manager verwendet (der heutzutage die meisten GNU / Linux-Distributionen enthält), ist es möglicherweise die beste Lösung, systemd zu verwenden, um Ihren Emacs-Daemon beim Booten zu starten. Sie können dies tun, indem Sie eine Datei $HOME/.config/systemd/user/emacs.servicemit den folgenden Inhalten erstellen :

[Unit]
Description=Emacs text editor
Documentation=info:emacs man:emacs(1) https://gnu.org/software/emacs/

[Service]
Type=simple
ExecStart=/usr/bin/emacs --fg-daemon
ExecStop=/usr/bin/emacsclient --eval "(kill-emacs)"
Environment=SSH_AUTH_SOCK=%t/keyring/ssh
Restart=on-failure

[Install]
WantedBy=default.target

Dann sollten Sie den Dienst starten und so einstellen, dass er für alle zukünftigen Starts automatisch gestartet wird:

$ systemctl enable --user emacs
$ systemctl start --user emacs

Sie können jetzt emacsclientwie gewohnt verwenden. Wenn Sie normalerweise mit den laufen -n, -coder -tOptionen können Sie einen Alias in der Shell eingestellt. Möglicherweise möchten Sie auch die Variablen EDITORund / oder VISUALUmgebungsvariablen so einstellen, dass sie nach Ihren Wünschen ausgeführt emacsclientwerden. In Bash können Sie Ihrer .bashrcDatei beispielsweise Folgendes hinzufügen :

alias emc="emacsclient -c"
export VISUAL="emacsclient -c"
export EDITOR="emacsclient -t"

Wenn Sie den Emacs-Daemon jemals stoppen müssen, können Sie dies wie folgt tun:

$ systemctl stop --user emacs

Und wenn Sie dauerhaft verhindern möchten, dass es beim Booten ausgeführt wird:

$ systemctl disable --user emacs
Psychonaut
quelle
1
Vielleicht sollte dieser Link zu EmacsWiki bestätigt werden: EmacsAsDaemon
HongboZhu
0

Die Art und Weise, wie ich das mache, ist einer vorherigen Antwort ziemlich ähnlich, da in meiner .bashrc für einen Alias ​​definiert ist emacs --daemon

alias ds="emacs --daemon"

Abgesehen davon habe ich eine Tastenkombination ctrl-alt-Eeingestellt emacsclient -c. Wenn ich mit der Arbeit an Emacs beginnen möchte, öffne ich ein Terminal und dstippe jede Emacsclient-Instanz mit meiner Verknüpfung ein und rufe sie auf.

Hoffe das hilft jemandem.

Nidish Narayanaa
quelle