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