Programación literaria y la configuración de Emacs
He visto infinidad de entradas en blogs referentes a Emacs que
tienen a bien, mostrar su propia configuración o init.el
, no suelo
leerlos, me interesan más las configuraciones puntuales de
determinados paquetes, mucho más que la completa de todo el sistema.
Sin embargo, hay quien me ha pedido que haga lo mismo y publique mi
fichero de configuración de Emacs. Supongo que pensarán que oculta
algo arcano, místico e inconfesable, para no iniciados, y hacer
rular el editor. Nada más lejos de la realidad. Sin embargo, si lo
único que quieres es chafardear el fichero de configuración, lo he
puesto en un repositorio de Codeberg. Sólo tienes que seguir el
enlace para verlo.
Si alguien con curiosidad ha pinchado el enlace y queda desconcertado
porque ve que sólo hay un README.org
con código dentro y se pregunta
que dónde está el init.el
, la respuesta corta es dentro del
README.org
, por supuesto. A la mayoría de los que lean este artículo
es posible que les resulte familiar el concepto de programación
literaria, pero puede ser algo nuevo para otros, así que me vais a
permitir que haga una breve explicación de lo que es.
Programación literaria
En español traducimos como programación literaria lo que denominó Donald E. Knuth1 literate programming, que también se podría traducir como programación letrada o instruida. Consiste en escribir un documento que contiene las explicaciones del código conteniendo el propio código. Ese documento servirá tanto como documentación del programa como generador de la fuente entresacando el código en un proceso que se llama tangle.
Es muy habitual el uso de la programación literaria en las
configuraciones de Emacs. Porque, al final, no es más que otra
herramienta para ordenar las ideas. Hay que tener en cuenta, que
aunque el init.el
sea código elisp
, en realidad no es un programa,
sino un montón de instrucciones para cargar paquetes, ajustar
variables, comportamientos, colores y zarandajas. Un programa, en
cambio, representa algo estructurado con una lógica interna. Una
configuración son ideas sin coherencia interna y, por tanto, la
programación literaria viene a dotar de alguna estructura a ese
amasijo de instrucciones.
Si se echa un vistazo a cómo se estructura el código podemos ver que
al final consiste en escribir un archivo org
con bloques de código
del estilo:
#+begin_src emacs-lisp :tangle ~/.emacs.d/init.el ... #+end_src
Para extraer luego esos bloques de código al(los) fichero(s)
correspondiente(s), basta hacer una llamada a la función
org-babel~tangle
, bien directamente o mediante la combinación de
teclas C-x C-v t
.
Si utilizas habitualmente este tipo de programación, un paquete que te
pude ayudar a acelerar tu flujo de trabajo es auto-tangle
.
Básicamente hace ese trabajo por nosotros. Cada vez que guardamos el
archivo org
con el que estamos trabajando llama por nosotros a la
función org-babel-tangle
. Eso evita que se nos olvide... me pasa
que de vez en cuando hago alguna modificación en el código voy a ver
cómo cambia el comportamiento y no cambiaba nada... porque no había
hecho el tangle. Con el paquete auto-tangle
evito esos
errores2.
Ventajas e inconvenientes
La ventaja principal es que obtienes la documentación a la vez que el código. A todos nos cuesta documentar lo que hemos hecho. Después de haber escrito el código, nos parece una tarea pesada y aciaga, contar lo que hace. Además, si acabamos de escribir el código, su funcionamiento nos parece autoexplicado y por tanto redundante. Nos aburre y, por eso, solemos tener el código huérfano de documentación. Cuando lo arrinconamos una temporada es posible que incluso no sepamos cómo lo hicimos funcionar o por qué hicimos algo de aquella determinada manera, que nos pareció tan clara que no contamos nada sobre ella en la documentación.
Por otro lado, a veces arrancar un proyecto que tienes en la cabeza cuesta un poco hasta que te centras y encuentras que lo primero va antes. Comenzar escribiendo qué queremos hacer nos puede facilitar la tarea de iniciarlo. Así, este estilo de programación, nos permite poner en claro las ideas antes de escribir una sola línea de código.
Para mí, no todo son ventajas: no me acomodo a él. Los inconvenientes
que he encontrado han sido varios, más achacables a mí que al
procedimiento en sí. Por ejemplo, programando con Emacs, estás
editando un archivo org-mode
, si editas un bloque de código no
tienes activadas las herramientas de autocompletado, revisión de
sintaxis y otras ayudas para el desarrollo en el lenguaje concreto.
Vale, lo puedes editar en un buffer del modo apropiado para el
lenguaje pulsando C-c '
para activar org-edit-special
, sin embargo
nos encontraremos que sólo carga el bloque donde hayas pulsado dicha
combinación. No tienes todo el código y sus relaciones, si llamas a
otras funciones que luego estarán en el mismo archivo de código, el
análisis de sintaxis te estará lanzando errores y warnings que no se
corresponden con la realidad. Además, es difícil que el autocompletado
reconozca tus propias funciones, que indefectiblemente se encuentran
en otros bloques, dentro o fuera, del archivo que estás modificando.
Después de estar un tiempo utilizándolo para algunos proyectos, por
aquello de probarlo todo, he llegado a la conclusión de que no es un
estilo de trabajo al que yo me adapte bien. Y eso que a mí casi me
gusta más escribir y contar lo que estoy haciendo, que hacerlo. Pero
no me resulta útil, me distrae y me cuesta seguir la lógica del
código. Me obliga a tener abiertos varios buffers con la
información: el org
y los fuentes generados por el tangle... y
claro, para aclararme también con los fuentes hay que meter
comentarios, por lo que algunas veces me encuentro escribiendo por
duplicado las mismas tontás.
Inicio de Emacs
El archivo de inicio que genera el código enlazado al principio de
este artículo está incompleto. No sólo porque me falta repasar si me
he dejado alguno de los paquetes que tengo instalados para llamarlo de
manera específica. También porque al arrancar, pedirá confirmación de
seguridad para los themes utilizados. Es decir, durante el primer
inicio, solicitará confianza en el código del tema en cuestión. Una
vez otorgada, el propio Emacs modificará por su cuenta el init.el
.
Al finalizar este artículo, el inicio va a cargar 116 paquetes, que en mi máquina le lleva algo más de 4 segundos. Si tenéis una máquina más lenta, es recomendable utilizar el modo server de Emacs. Tener el editor corriendo en modo demonio se realiza con la instrucción:
emacs --daemon
Para conectarse a él, en lugar de levantar desde cero todo ese
enjambre de paquetes, se llama al ejecutable emacsclient
. También
podemos automatizarlo un poco desde nuestra consola, para que utilice
las variables de entorno correctas. Podemos escribir en nuestro
.bashrc
, por ejemplo:
export ALTERNATE_EDITOR="emacs" export EDITOR="emacsclient -t" export VISUAL="emacsclient -c -a emacs"
O si estás utilizando fish
:
set ALTERNATE_EDITOR "emacs" set EDITOR "emacsclient -t" set VISUAL "emacsclient -c -a emacs"
Muchas aplicaciones utilizan la variable de entorno EDITOR
, para
abrir un editor, valga la rebuznancia, en consola en modo texto (por
eso la opción -t
) y VISUAL
para lanzar un editor en modo ventana,
esa es la opción -c
. La coletilla -a emacs
le dice que utilice, si
no puede llamar a emacsclient
el comando habitual de emacs
como
editor alternativo. Por ejemplo, si utilizas fish
como shell, al
pulsar M-e
(o Alt-E
, si lo prefieres nombrar así), llamará a
VISUAL
. O utilizando git
desde línea de comandos, cuando solicita
que escribas un mensaje para el commit, llama a EDITOR
.
Conclusión
Compartiendo el init.el
no creo que aporte nada especial. El hacerlo
con programación literaria, siguiendo un poco las modas o costumbres
entre los usuarios de Emacs es sólo para tener algún motivo más para
escribir este artículo. Quizá el tema de la programación literaria
merezca más detenimiento o una explicación más larga. Ya me lo diréis.
Por último, algunos se quejan de que configuraciones complejas o con cientos de paquetes, como es mi caso, tardan mucho es máquinas menos potentes. Por eso añadí el apartado de Inicio de Emacs, con la esperanza de que le sea útil a alguien.
Comentarios