Emacsclient: un solo proceso de emacs todo el tiempo desde el inicio y nunca cerrar y mejor ocultar la GUI

9

Dado que emacsclient puede manejar el largo tiempo de carga de paquetes de manera correcta, realmente quiero mantener al menos un proceso de emacs, y la mayoría de las veces solo un proceso de emacs , abrir como proceso en segundo plano y ocultar mejor la GUI.

En este momento definí la siguiente función en .bashrc:

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

Y también tiene la siguiente línea en .bashrc:

emc

Entonces, cada vez que abro un shell, terminaré teniendo un nuevo proceso de emacs.

El problema es que tendré muchos procesos emacs innecesarios adicionales después de abrir muchos shells. Sin embargo, solo quiero mantener un solo proceso de emacs todo el tiempo desde el inicio para ocultar mejor la GUI .

coleccionables
fuente
55
No estoy familiarizado con la práctica de en emacs --eval "(suspend-frame)"lugar de emacs --daemon( emacswiki.org/emacs/EmacsAsDaemon ). ¿Hay alguna razón por la que eliges no invocar a emacs como demonio? Podría usar algo como pgrep -U `whoami` emacs || emacs --daemon &para asegurarse de que se está ejecutando.
ebpa
Consulte los scripts de MJ Wall para usar el cliente Emacs.
Tianxiang Xiong

Respuestas:

13

Lo hago iniciando un demonio emacs cuando inicio sesión. El lugar donde coloca este comando depende de su administrador de escritorio. Yo uso i3, que está configurado para ejecutar un script en el inicio de sesión que incluye lo siguiente:

emacs --daemon &

Con eso, emacs siempre se ejecuta en segundo plano, y abro un nuevo cliente con emacsclient -c -n, vinculado a una combinación de teclas conveniente en el administrador de ventanas. Si está trabajando en una terminal, solo necesita un alias simple como alias emc='emacsclient', posiblemente con -n, -co -targumentos, dependiendo de cómo lo use.

Verifique las opciones para emacsclient en el manual: ( (emacs) Opciones de emacsclient , accesibles desde Emacs por C-h r m emacsclient options <enter>). Puede utilizar la -abandera para iniciar automáticamente una emacs demonio si este no está en ejecución y, -co -tpara abrir un nuevo marco o cliente de terminal, en lugar de la reutilización de una existente (en la misma sesión):

'-un comando'
'--alternate-editor = COMMAND'
     Especifique un comando para ejecutar si 'emacsclient' no puede contactar con Emacs.
     Esto es útil cuando se ejecuta 'emacsclient' en un script.

     Como excepción especial, si COMMAND es la cadena vacía, entonces
     'emacsclient' inicia Emacs en modo daemon (como 'emacs --daemon') y
     luego intenta conectarse de nuevo.

'-C'
'--create-frame'
     Cree un nuevo "marco de cliente" gráfico, en lugar de utilizar uno existente
     Marco Emacs. Consulte a continuación el comportamiento especial de 'Cx C-c' en un
     marco del cliente Si Emacs no puede crear un nuevo marco gráfico (por ejemplo,
     si no puede conectarse al servidor X), intenta crear un texto
     marco del cliente terminal, como si hubiera proporcionado la opción '-t'
     en lugar.

'-t'
'--tty'
'-noroeste'
     Cree un nuevo marco de cliente en el terminal de texto actual, en lugar de
     utilizando un marco Emacs existente. Esto se comporta como el '-c'
     opción, descrita anteriormente, excepto que crea un terminal de texto
     marco (* nota Terminales sin ventana: :).
Tyler
fuente
4

Si está utilizando un sistema operativo que utiliza el administrador de servicios systemd (que actualmente incluye la mayoría de las distribuciones de GNU / Linux), entonces la mejor solución podría ser utilizar systemd para iniciar su demonio Emacs en el arranque. Puede hacer esto creando un archivo $HOME/.config/systemd/user/emacs.servicecon el siguiente contenido:

[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

Luego, debe iniciar el servicio y configurarlo para que se inicie automáticamente para todas las botas futuras:

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

Ahora puede usar emacsclientcomo de costumbre. Si suele ejecutar con los -n, -co -tlas opciones, se puede establecer un alias en su concha. También es posible que desee establecer las variables de entorno EDITORy / o VISUALpara que se ejecuten de emacsclientla manera que desee. Por ejemplo, en Bash, puede agregar lo siguiente a su .bashrcarchivo:

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

Si alguna vez necesita detener el demonio Emacs, puede hacerlo de la siguiente manera:

$ systemctl stop --user emacs

Y si quieres evitar que se ejecute permanentemente en el arranque:

$ systemctl disable --user emacs
Psiconauta
fuente
1
quizás este enlace a EmacsWiki debería reconocerse: EmacsAsDaemon
HongboZhu
0

La forma en que lo hago es bastante similar a una respuesta anterior, al tener un alias definido en mi .bashrc para emacs --daemon

alias ds="emacs --daemon"

Aparte de esto, tengo un atajo de teclado ctrl-alt-Econfigurado en emacsclient -c. Cuando quiero comenzar a trabajar en emacs, abro un terminal y escribo dsy llamo cada instancia de emacsclient con mi acceso directo.

Espero que esto ayude a alguien.

Nidish Narayanaa
fuente