Notxor tiene un blog

Defenestrando la vida


Niveles de configuración en emacs

Una de las primeras cosas que se ve cuando uno se acerca a emacs es la pantalla de about-emacs y poco más. De primera vista lo único que destaca es el aspecto antiguo, algunos dirán: rancio, del diseño. A quien diga lo de rancio, no le falta razón. Emacs es un editor con mucho recorrido a la espalda y su diseño proviene de tiempos en los que la interface más habitual era la consola de texto y no estaban inventadas las teclas de cortar, copiar y pegar, ni tenían esos nombres, cuando este editor ya contemplaba esas acciones.

Quien decide profundizar en emacs, a pesar de su inicial apariencia de software desfasado, descubre un inmenso mundo de posibilidades que exceden el mero hecho de editar texto plano. El modo gráfico de emacs no es equivalente a usar gvim para un usuario de vim. El modo gráfico de emacs te permite visualizar pdf, leer epub, modificar svg, leer texto acompañado de sus gráficos y fotografías, navegar por páginas web o jugar al tetris. Todo ello gracias al lenguaje que viene con él y que permite hacer de todo; tanto, que hay un gestor de ventanas que básicamente es emacs distribuyendo sus frames en la pantalla.

Si estás leyendo este artículo, seguramente ya conocerás las maravillas de emacs y no voy a contarte nada nuevo. Si no las conoces tienes todo el blog para enterarte, porque creo que hablo de todas las cosas que hago con él. No voy a cansinar más con el tema y vamos al lío... ¿Cuál es el lío? La configuración, sin duda. Toda la potencia de emacs radica en una buena configuración. Configuración tan flexible y potente que a veces se atraganta a los nuevos usuarios, especialmente si desconocen Lisp en general y más concretamente emacs lisp. Si es tu caso, estás leyendo esto y no te aclaras muy buen con elisp, hace unos meses escribí una serie de artículos como introducción a la programación con elisp.

Jerarquía de configuraciones

¿Tan importante es elisp? La respuesta a esa pregunta podría ocupar todo un artículo del blog, pero voy a dejarlo en un escueto . Por supuesto, en elisp están escritos todos los paquetes que extienden funcionalidad de emacs y también el fichero de configuración. Así que sí, tienes que saber un poquito de ese lenguaje: lo suficiente como para asignar un valor a una variable si sólo lo vas a utilizar para configurar tu editor.

Configuración general

El fichero de configuración general se llama init.el y emacs lo busca en el subdirectorio .emacs.d de tu directorio de usuario. Al principio no necesitas escribir una línea de código para configurarlo. Si estás acostumbrado a utilizar herramientas gráficas encontrarás menús y botones en Options, para hacerlo. Pero con el tiempo, estoy seguro que terminarás utilizando la edición directa del código en lugar de trastear con menús y botones que andan por ahí escondidos en la configuración visual.

Como ya he explicado varias veces cómo configurar paquetes, e incluso he hablado alguna vez sobre mi init.el en este blog, no voy a hacer más extensa esta parte.

Configuración local

Por si no había suficiente flexibilidad en la configuración general también nos encontramos con la figura de la configuración local. Básicamente consiste en meter un fichero llamado .dir-locals.el en el directorio de trabajo. Eso afectará a la configuración de todos los ficheros que se encuentren en el directorio y los subdirectorios que cuelguen de él. ¿Para qué? Pues a veces ocurre que necesitas cambiar los parámetros básicos tal y como te gustan a ti, para un proyecto en particular.

Pongo dos ejemplos que me han ocurrido y donde la configuración local me ha venido a salvar los trastos. En el primer caso se trataba de un proyecto de programación y se acordó entre los participantes que el código debía utilizar tabuladores de ancho 4. Yo siempre utilizo espacios y resultaría muy cansino cambiar la configuración general de emacs cada vez que me ponía a programar. La solución fue meter en el directorio raíz del proyecto un fichero .dir-locals.el con el siguiente contenido:

((nil
  (fill-column . 80))
 (c-mode
  (indent-tabs-mode .t)
  (tab-stop . 4)))

Se puede apreciar que lo que contiene un fichero de configuración local viene a ser un listado de variaciones para cada modo mayor que se necesite. Cada uno de esos modos contiene una lista de nombres de variables y sus valores para el proyecto. También se puede especificar nil para el modo, lo que hará que se aplique en todos los modos activados en ese directorio.

En este caso el cambio en la configuración venía impuesta por el equipo de trabajo. Pero en el siguiente, la imposición venía de una herramienta.

Alguna vez he contado que para traducir textos utilizo una herramienta en Java que facilita la gestión de ese trabajo. El tema es que esa herramienta no reconoce la extensión .org como fichero que pueda trabajar y tuve que renombrar los todos los ficheros de un proyecto a la extensión .txt, pero así, cuando los abría con emacs los habría en modo Fundamental en lugar de org-mode. La solución como lo podéis imaginar fue crear un fichero en el directorio de fuentes. Al tener la extensión .el y estar oculto, OmegaT no lo reconoce para trabajarlo en la traducción, pero lo copiará al directorio de ficheros traducidos porque interpreta que es parte del proyecto.

;;; Directory Local Variables
;;; For more information see (info "(emacs) Directory Variables")

((org-mode
  (fill-column . 75)
  (eval . (org-show-all)))
 (text-mode
  (mode . org)))

Viendo el código podéis suponer que emacs tiene alguna manera de insertar las variables en ese fichero de forma más o menos automática sin tener que recordar la sintaxis de la lista de listas y lo hay: add-dir-local-variable. Preguntará por un modo, luego por una variable y al final por un valor. Por supuesto, también encontraréis su contrario delete-dir-local-variable.

Quiero destacar también la expresión (eval . (org-show-all)), porque como se puede ver, se puede ejecutar código también desde la configuración de variables locales. En este caso, lo que hace es que todos los ficheros que se abran en modo org se mostrarán en formato desplegado. Sin embargo, emacs considera que no es seguro hacer esto y preguntará al usuario si lo ejecuta o no, mostrando un diálogo y esperando hasta que contestemos antes de abrir un archivo en un modo en el que tenga que evaluar código.

Configuración de fichero

Y ¿qué ocurre si hay algún fichero que necesite algún tratamiento especial? Pues para ello existen las variables de fichero, que igual que las variables de directorio o locales sobrescriben las variables globales, las de fichero sobrescriben las locales.

Si llevas un tiempo utilizando emacs habrás visto en algunos ficheros una primera línea tal que por ejemplo:

# -*- mode: org-mode; coding: utf-8; -*-

Esa línea informa a emacs que el fichero que se ha abierto en el buffer tendrá que tratarlo como un fichero org y que debe utilizar la codificación utf-8.

En lugar de utilizar una lista como esa, empaquetada en una sola línea, que puede dificultar su lectura y comprensión, también podríamos hacerlo en forma de listado:

# Local Variables:
# mode: org-mode
# coding: utf-8
# End:

Hay que observar que la primera línea debe ser Local Variables: y hay que acabar el listado con End:. Podemos, como hemos visto en el punto anterior evaluar algo de código, por ejemplo:

# Local Variables:
# mode: org-mode
# eval: (org-show-all)
# End:

Hará que el fichero sea tratado como org y además ejecutará la función org-show-all. También, como he dicho en el apartado anterior, antes de hacer esa ejecución preguntará al usuario si es seguro realizarla o no. En el caso de este ejemplo el mismo efecto lo conseguiríamos utilizando las herramientas que nos proporciona org-mode para hacer lo mismo y la cosa la dejaríamos así:

# Local Variables:
# mode: org-mode
# End:

#+STARTUP: showall

Conclusiones

Como se puede ver la forma de configuración que nos permite emacs es mucho más precisa que simplemente establecer variables en un fichero general. La jerarquía de configuraciones hace que podamos establecer los modos hasta el nivel más bajo independientemente de las establecidas de forma general.

Esta potencia y flexibilidad también puede aportar algo de inseguridad pues abrir un fichero de texto puede implicar la ejecución de código que podría ser malicioso.

En la documentación que viene con emacs están todos estos temas mucho más detallados de lo que yo he descrito aquí, aunque quizá no organizados de esta forma.


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.