Notxor tiene un blog

Defenestrando la vida

Programación literaria y la configuración de Emacs

2022-08-31

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.

Footnotes:

1

Sí, el autor de TeX.

2

Hasta que te olvidas de guardar los cambios a disco, que estarás en las mismas.

Categoría: emacs programación

Comentarios

Debido a algunos ataques mailintencionados a través de la herramienta de comentarios, he decidido no proporcionar dicha opción en el Blog. Si alguien quiere comentar algo, me puede encontrar en Mastodon y en Diaspora con el nick de Notxor.

También se ha abierto un grupo en Telegram, para usuarios de esa red.

Disculpen las molestias.