Emacsclient: un singolo emacs elabora continuamente all'avvio e non chiude mai e nasconde meglio la GUI


9

Poiché emacsclient è in grado di gestire in modo corretto lunghi tempi di caricamento dei pacchetti, voglio davvero mantenere almeno un processo emacs, e il più delle volte solo un processo emacs , aperto come processo in background e nascondere meglio la GUI.

In questo momento ho definito la seguente funzione in .bashrc:

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

E avere anche la seguente riga in .bashrc:

emc

Quindi ogni volta che apro una shell, finirò per avere un nuovo processo di emacs.

Il problema è che avrò molti processi di emacs non necessari dopo aver aperto molte shell. Tuttavia, voglio solo mantenere un singolo processo emacs in ogni momento dall'avvio per nascondere meglio la GUI .


5
Non ho familiarità con la pratica emacs --eval "(suspend-frame)"piuttosto che con emacs --daemon( emacswiki.org/emacs/EmacsAsDaemon ). C'è un motivo per cui scegli di non invocare emacs come demone? È possibile utilizzare qualcosa di simile pgrep -U `whoami` emacs || emacs --daemon &per assicurarsi che sia in esecuzione.
ebpa,

Controlla gli script di MJ Wall per l'utilizzo del client Emacs.
Tianxiang Xiong,

Risposte:


13

Lo faccio avviando un demone emacs quando accedo. La posizione in cui si inserisce questo comando dipende dal desktop manager. Io uso i3, che è configurato per eseguire uno script all'accesso che include quanto segue:

emacs --daemon &

Con ciò, emacs è sempre in esecuzione in background, e io apro un nuovo client emacsclient -c -n, associato a un comodo keybinding nel gestore delle finestre. Se lavori in un terminale, hai solo bisogno di un semplice alias come alias emc='emacsclient', possibilmente con -n, -co -targomenti, a seconda di come lo usi.

Dai un'occhiata alle opzioni per emacsclient nel manuale: ( (emacs) Opzioni emacsclient , accessibili da Emacs da C-h r m emacsclient options <enter>). È possibile utilizzare il -aflag per automaticamente avviare un emacs demone, se non è già in esecuzione, e -co -tper aprire una nuova cornice o terminal client, piuttosto che riutilizzare uno esistente (nella stessa sessione):

'-un comando'
'--Alternate-editore = COMANDO'
     Specificare un comando da eseguire se 'emacsclient' non riesce a contattare Emacs.
     Ciò è utile quando si esegue "emacsclient" in uno script.

     Come eccezione speciale, se COMMAND è la stringa vuota, allora
     'emacsclient' avvia Emacs in modalità demone (come 'emacs --daemon') e
     quindi prova nuovamente a connettersi.

'-C'
'--Create-frame'
     Creare un nuovo "frame client" grafico, anziché utilizzare un esistente
     Cornice Emacs. Vedi sotto per il comportamento speciale di 'Cx C-c' in a
     frame client. Se Emacs non è in grado di creare un nuovo frame grafico (ad es.
     se non riesce a connettersi al server X), prova a creare un testo
     frame del client terminal, come se fosse stata fornita l'opzione '-t'
     anziché.

'-T'
'--Tty'
'-Nw'
     Crea un nuovo frame client sul terminale di testo corrente, anziché
     usando un frame Emacs esistente. Questo si comporta proprio come '-c'
     opzione, descritta sopra, tranne per il fatto che crea un terminale di testo
     frame (* note Terminali non-finestra: :).

4

Se stai utilizzando un sistema operativo che utilizza il gestore dei servizi di systemd (che al giorno d'oggi include la maggior parte delle distribuzioni GNU / Linux), la soluzione migliore potrebbe essere quella di utilizzare systemd per avviare il demone Emacs all'avvio. Puoi farlo creando un file $HOME/.config/systemd/user/emacs.servicecon i seguenti contenuti:

[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

Quindi dovresti avviare il servizio e impostarlo per l'avvio automatico per tutti gli stivali futuri:

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

Ora puoi usare emacsclientcome al solito. Se normalmente si esegue con la -n, -co -tle opzioni, è possibile impostare un alias nella shell. Potresti anche voler impostare le variabili di ambiente EDITORe / o VISUALper farlo emacsclientcome preferisci. Ad esempio, in Bash, potresti aggiungere quanto segue al tuo .bashrcfile:

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

Se hai mai bisogno di fermare il demone Emacs, puoi farlo come segue:

$ systemctl stop --user emacs

E se vuoi interrompere definitivamente l'esecuzione all'avvio:

$ systemctl disable --user emacs

1
forse questo link a EmacsWiki dovrebbe essere riconosciuto: EmacsAsDaemon
HongboZhu,

0

Il modo in cui lo faccio è abbastanza simile a una risposta precedente, avendo un alias definito nel mio .bashrc per emacs --daemon

alias ds="emacs --daemon"

A parte questo, ho una scorciatoia da tastiera ctrl-alt-Eimpostata su emacsclient -c. Quando voglio iniziare a lavorare su emacs apro un terminale e dsscrivo e richiamo ogni istanza emacsclient con il mio collegamento.

Spero che questo aiuti qualcuno.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.