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 sí. 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.