Notxor tiene un blog

Defenestrando la vida


Usando emacsclient.

Hace tiempo que vengo utilizando emacs para casi todo y eso hace que lo tenga abierto casi todo el rato. Algunas veces lo cierro, evidentemente. Pasados unos minutos tengo que hacer algo: repasar la agenda, actualizar la contabilidad, escribir un artículo en el blog... casi cualquier cosa, en mi actualidad, pasa por iniciar emacs.

Por eso llegué al uso de emacsclient. En realidad consiste en tener una sesión de emacs abierta siempre en modo daemon y lanzar el editor con un cliente que lo que hace es conectarse a esa sesión, por lo que sólo tiene que dibujar una ventana en el sistema y se gana en velocidad de inicio.

Lanzar emacs en modo servidor

Para lanzar emacs en modo servidor sólo tenemos que utilizar el comando

emacs --daemon

En mi caso, como el gestor de ventanas que utilizo es i3wm lo que he hecho es añadir una línea en el fichero de configuración ~/.config/i3/config como la siguente:

exec emacs --daemon

Eso hace que al arrancar la sesión de i3wm cargue emacs y lo tenga disponible de forma rápida cuando lo necesito.

Acceder al demonio emacs con emacsclient

Una vez cargado emacs en memoria tenemos que lanzar el cliente que pueda conectarse a ese servicio. La misma instalación de emacs provee el comando emacsclient. Conviene mirarse la página de manual de la herramienta para conocer todas las opciones, aunque yo lo utilizo como explico a continuación.

Lanzarlo desde i3wm

Como he dicho antes, utilizo el gestor de ventanas i3wm que me permite olvidarme del ratón para muchas cosas y trabajar con combinaciones de teclas que me facilitan y aceleran los accesos a las ventanas, los escritorios y las aplicaciones mucho más rápido que cualquier sistema de menús gráficos.

Antes de utilizar emacsclient había creado una combinación de teclas que lanzaba emacs en el fichero de configuración del entorno i3wm. La forma de hacerlo es muy sencilla:

set $alt Mod1
...
...
bindsym Ctrl+$alt+e exec emacs

Eso hacía que pulsando las teclas C-M-e (siguiendo la notación habitual de nuestro editor favorito) se lanzara una sesión de emacs. Algo sencillo, rápido y cómodo. Al cambiar utilizar emacsclient la línea ha cambiado a:

bindsym Ctrl+$alt+e exec emacsclient -c -a emacs

Básicamente llamamos a emacsclient diciéndole que inicie una sesión gráfica, con el parámetro -c y que si hay algún problema utilice como editor alternativo (parámetro -a <editor>) el propio emacs en su modo completo.

Variables de entorno

Otro de los puntos que he modificado son las variables de entorno para que el sistema sepa qué editor tiene que lanzar. En mi fichero .bashrc tengo las líneas siguientes:

export EDITOR="emacsclient -t"
export VISUAL="emacsclient -c -a emacs"

El valor de VISUAL ya lo he comentado antes, sólo nos falta decir que el parámetro -t que utilizo en la variable EDITOR, abre la sesión en una consola de texto. También se podría utilizar el parámetro -nw del emacs genérico y funcionaría del mismo modo.

Cambios en el modo de trabajo

He tenido que cambiar algunos hábitos de trabajo teniendo una única sesión de emacs lanzada, puesto que no se cierran los buffers al cerrar con C-x C-c, sólo se cierra el cliente que hayas abierto, pero emacs sigue trabajando con ellos en segundo plano.

Inconvenientes

Si termino la edición de un fichero y estoy convencido de que no voy a necesitarlo más, que no voy a modificarlo ni consultarlo, tengo que recordar cerrar el buffer con C-x k. Si no, el fichero seguirá cargado en memoria.

Otro inconveniente es tener siempre cargado en memoria una sesión de emacs. Aunque la cantidad de memoria consumida ha dejado de preocuparme, en realidad es mínimo y después de comprobarlo, incluso editando varios archivos resulta más ligero que algunos otros demonios que tengo en el sistema, como el cliente de nextcloud, por ejemplo. Y si nos fijamos en el gasto de CPU, el tiempo de procesador es mínimo mientras está inactivo, por lo que tampoco me preocupa.

Ventajas

El tiempo de inicio del cliente es mínimo. Es pulsar la combinación de teclas y la ventana de emacs aparece sin ningún tipo de dilación, no tiene que cargar ninguna configuración, porque ya la tiene cargada.

Modificar los ficheros desde distintos clientes a la vez. Puesto que el emacs es único, cualquier cambio que hagamos en un buffer desde un cliente se refleja automáticamente en los demás clientes abiertos; y siempre que se cierra un cliente te pregunta si quieres guardar los cambios. Esto me viene bien, porque suelo trabajar en modo texto normalmente. A veces necesito visualizar gráficos, o pdf, o consultar webs, o leer los feeds, o... y para eso me apaño mejor con la versión gráfica de emacs. Sin cerrar, ni guardar nada; sin abrir, ni cargar nada, abro un cliente gráfico y sigo trabajando con los mismos buffers que tengo abiertos en el modo texto. Veo lo que necesito, luego cierro lo que no necesito y me vuelvo al modo texto.

Conclusiones

Aún, después de unos días, me estoy acostumbrando a una dinámica diferente a la que llevo haciendo toda la vida. El cambio está siendo rápido y me siento más productivo. Aunque aún me pasa que se me olvidan cerrar algunos buffers y me los encuentro abiertos cuando vuelvo a abrir el cliente. Algunas veces para bien, porque estaba trabajando en algo antes de irme a comer, por ejemplo, y me encuentro que ya lo tengo abierto cuando vuelvo. Otras veces, sin embargo, me encuentro una ristra de buffers secundarios de magit abiertos, de distintos repositorios de proyectos y cosas y tengo que emplear un poco de tiempo en matar todo lo innecesario.

Si al final encuentro cómoda esta forma de trabajar supongo que modificaré el modo para que sea el propio sistema el que lance emacs en modo servidor y así poder tenerlo en cualquier situación, cualquier entorno de ventanas o incluso en la consola de texto. Supongo que systemctrl tendrá algún modo de hacerlo. De momento seguiré con el modo de andar por casa que me he montado a ver qué tal.


Comentarios

Debido a algunos ataques mailintencionados a través de la herramienta de comentarios, se ha decidido activar un filtro antispam y guardar las direcciones IP con el único objeto de añadir a la lista de bloqueos las que correspondan a spam y otras actividades maliciosas.

Disculpen las molestias.