Cuaderno de GNUtas

Optimizar una instalación limpia de Emacs (los primeros pasos)

El archivo de inicio de GNU Emacs, el célebre ~/.emacs, es el árbol que todo emacsiano que se precie tiene el deber de cuidar, regar y, en no poco tiempo, aterrarse al verlo crecer. Aunque tampoco hace falta multiplicar el trabajo en caso de que tengamos varias instalaciones de Emacs repartidas en más de un ordenador (yo lo tengo hasta en la Raspberry y en el móvil1, tela), ya que nos bastaría con un sólo archivo de inicio que gestionar: un ~/.emacs único para gobernarlos a todos. O intentarlo, al menos. En mi caso, por ejemplo, este archivo lo guardo en la nube con Nextcloud. Y tengo escritos unos scripts muy simples para sincronizarlo y modificarlo según la configuración local de cada máquina. Las ventaja de hacerlo así es que Emacs siempre se comportará y lucirá igual independientemente del ordenador donde estemos trabajando. Y si queremos hacer una instalación limpia de nuestro querido editor, no hará falta configurarlo todo desde cero.

Pero el motivo de esta gnuta es precisamente todo lo contrario. Imaginemos, sí, que queremos configurarlo todo desde cero, acaso porque estamos dando nuestros primeros pasos en Emacs. Siempre estaremos dando los primeros pasos, no lo duden, pero eso ya es otro cantar… En cualquier caso, puede que le resulten útiles a alguien estas pautas y consejillos que aquí apuntaré para empezar a configurar un ~/.emacs más o menos decente, al menos en lo que toca a la tierra y al abono de nuestro futuro árbol. Por supuesto, desde mi humilde experiencia personal e intransferible. Lo preferible es siempre ir trasteando y probando, y encontrar lo que mejor se adapta a nuestras necesidades, porque esto es software libre. Comencemos.

Orden y limpieza

Habrá tantos archivos de inicio como usuarios variopintos tiene Emacs. Pero no está de más comenzar por una regla de oro sobre la cual parece haber cierto consenso. No es otra que la de procurar ser ordenados y pulcros antes de ponernos a escribir líneas de código como desesperados. El archivo puede volverse enseguida muy complejo. Y hasta confuso: funciones, atajos de teclado definidos, llamadas a paquetes y bibliotecas, valores aplicados a variables y un largo etc. Pero Emacs también escribirá allí lo suyo, en caso de que hayamos configurado y marcado o desmarcado opciones desde los menús de la interfaz del editor. Mejor no configurar de ese modo (o hacerlo lo menos posible), si es que pretendemos obtener un archivo reutilizable en otras máquinas, y que todas las opciones y personalizaciones las escribamos nosotros directamente en Elisp de nuestro puño y letra (lo cual también tiene su lado bueno didáctico), en lugar de hacerlo desde los menús habilitados a tal efecto. Pero si ya es inevitable y lo hemos hecho, debemos saber que lo que escribe Emacs está siempre bajo el paraguas (más bien paréntesis) (custom-set-variables...). Y si hemos personalizado fuentes y otras cuestiones de tema y aspecto, estarán bajo (custom-set-faces...).

No escatimemos tampoco en comentarios al código. Y si este código está tomado de terceros, ya sea literalmente o modificado y readaptado por nosotros, será justo y necesario indicar la fuente (y la autoría, si la conocemos) en los comentarios. Y deseable (además de bastante práctico) es mantener también aquí un orden y agrupar temáticamente las líneas de código, las funciones, etc.

Pero no basta con el orden si vamos a acabar inflando desmesuradamente nuestro ~/.emacs. Bien, hemos dicho que es normal que estos archivos crezcan y sean extensos. Pero lo ideal es que lo hagan con una cierta armonía y no de cualquier forma y en cualquier dirección. Es decir, que si un día nos encontramos con muchísimo código para una cosa concreta, podemos plantearnos si no será mejor crear con ese código una biblioteca temática o, si nos animamos, un modo menor. Una buena práctica es mandar nuestras bibliotecas o modos (que tendrán, por supuesto, la extensión *.el) a una carpeta específica llamada lisp bajo el directorio /.emacs.d/. Si no existe, la creamos. Y, para que Emacs sepa el camino, escribiremos en nuestro archivo de inicio:

(add-to-list 'load-path "~/.emacs.d/lisp/")

Y, a continuación, ya podremos cargar a voluntad nuestras bibliotecas o modos contenidos allí. Por ejemplo, si tengo un mibiblioteca.el, escribiré:

(load "mibiblioteca.el")

De esa forma no sobrecargo mi archivo de inicio con colesterol. Este archivo es mejor planteárselo como un archivo de gestión global, más que un saco sin fondo donde meter y meter todo lo que se nos ocurra.

Ahorrar espacio vertical en la pantalla

A no ser que lo arranquemos desde una terminal (orden típica: emacs -nw), nuestro Emacs acudirá con una barra de herramientas arriba que no sólo es fea con ganas, sino que además resulta completamente inútil, habida cuenta de que la salsa de este editor es usarlo desde el teclado. Es una barra que lo único que hace es estorbar, de modo que en mi archivo de inicio tengo esto:

(tool-bar-mode -1)

Podemos eliminar también la barra de menú:

(menu-bar-mode -1)

aunque siempre habrá opción de recuperarlo, en forma de menú en cascada y en la posición del cursor, cada vez que pulsemos F10. Otra posibilidad es tener una barra de menú que aparezca o desaparezca siempre que pulsemos una tecla, por ejemplo F9:

(global-set-key [f9] 'toggle-menu-bar-mode-from-frame)

¿CUA o no CUA?

En Emacs podemos habilitar desde sus menús los típicos atajos CUA (de Common User Access) para copiar, pegar, cortar, etc. Yo prefiero utilizar los atajos nativos de Emacs, y así dejo libre la secuencia C-x. El caso es que me resultan más cómodos y más «emacscéntricos». Eso sí, también por comodidad, mantengo el atajo universal de deshacer como C-z2. Para ello, añado a mi archivo de inicio:

(define-key global-map (kbd "C-z") 'undo)

Por otra parte, si mantenemos los atajos nativos de Emacs y no activamos el modo CUA, hay un comportamiento por defecto que nos puede resultar chocante y que a mí me incordia mucho. Si copiamos un texto, señalamos otro y pulsamos C-y (el atajo de pegar desde el portapapeles, es decir, el yanking en la jerga de Emacs), no se nos sustituirá un texto por otro, sino que el nuevo texto se pegará justo a continuación del viejo. Para evitar eso:

(delete-selection-mode 1)

El dichoso pitidito

Sí, para darnos ciertos avisos, Emacs nos desasosiega con el incomodísimo timbre del sistema: piiiiiiii. Podemos enmudecerlo y optar por que esos avisos sean visuales:

(setq visible-bell t)

Para que Emacs reconsidere su noción de «frase»

Para Emacs una frase (sentence) es todo aquello que termina con un punto y dos espacios, ya que asume la convención tipográfica americana. Yo no añado nunca un doble espacio tras un punto y seguido, y me temo que poca gente lo hará en el ámbito hispanohablante o en cualquiera. Si vamos a utilizar mucho los atajos M-a (backward-sentence), M-e (forward-sentence), M-k (kill-sentence) o C-x <DEL> (backward-kill-sentence), que, por cierto, son bastante útiles para navegar por el texto y manipularlo, conviene entonces añadir a nuestro archivo de inicio:

(setq sentence-end-double-space nil)

dándole un valor cero (nil) a esa variable.

Localización geográfica

La función nativa de Emacs sunrise-sunset nos informa puntualmente, si la llamamos de manera interactiva, acerca de las horas de salida y puesta del sol del presente día. Habrá quien pueda pensar que estas cosas no competen a un editor de texto, pero esto es Emacs, estimados, y en Emacs querremos saber datos así, u otros incluso más peregrinos. En mi archivo de inicio, pues, tengo las coordenadas de Cercedilla:

(setq calendar-location-name "Madrid, ES")
(setq calendar-latitude 40.5914000)
(setq calendar-longitude -4.1474000)

Repositorios MELPA

Es sabido que GNU Emacs tiene sus propios repositorios de paquetes y bibliotecas, tanto las que pertenecen al proyecto como las escritas por terceros. Y también cuenta con su propio gestor de paquetes, de manera que podamos instalarlos o actualizarlos sin salir de nuestro editor. La oferta es vastísima, como se puede comprobar si accedemos a la lista de paquetes disponibles mediante las secuencia M-x list-packages RET. Si queremos instalar un paquete, basta con situar el cursor sobre él y teclear «i». Así lo marcamos para su instalación3. Podemos marcar cuantos paquetes queramos. Y a continuación pulsamos «x» para ejecutar el proceso. Naturalmente, se nos pedirá confirmación antes desde el minibúfer.

Por defecto, Emacs no viene con el repositorio MELPA habilitado, que es donde se encuentran las versiones últimas y calientes de los paquetes. Para poder acceder a él, necesitamos escribir en nuestro ~/.emacs:

(add-to-list 'package-archives
	     '("melpa" . "http://melpa.milkbox.net/packages/") t)

whitespace-cleanup

Una de las cosas que más me fastidian es que los documentos se me acaben llenando de espacios espurios, especialmente los de las líneas vacías del principio y del final. La función nativa de Emacs whitespace-cleanup nos realiza una minuciosa limpieza de todo ese blanco malgastado en nuestros archivos. Para no tener que estar llamándola cada dos por tres, podemos anclarla de forma que se ejecute cada vez que guardemos un archivo:

(add-hook 'before-save-hook 'whitespace-cleanup)

Esta función, como decía, está más especializada en eliminar una serie de espacios concretos, como los del principio y final del documento, los espacios alrededor de los tabuladores, etc. Si queremos también simplificar la separación entre párrafos y dejar sólamente una línea blanca entre ellos, podemos definir esta sencilla función y ponerla en nuestro ~/.emacs:

(defun simplifica-espacios-parrafo ()
 (interactive)
 (save-excursion
   (goto-char (point-min))
   (replace-regexp "\n\n\n+" "\n\n" nil)))

Igualmente, podemos anclarla al momento de guardar el archivo o asignarle un atajo de teclado.

Conclusión

Con todo lo anterior ya tendremos, creo, una buena base para comenzar a usar nuestro Emacs con comodidad. En próximas gnutas (cuándo, no podría decirlo) trataremos sobre cosas más elaboradas para ir añadiendo a nuestro archivo de inicio y, sobre todo, algunos paquetes que considero esenciales y no deberían faltar en ninguna instalación emacsiana.

Publicado: 29/06/2019

Última actualización: 29/06/2019


Índice general

Acerca de...

Esta obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial 4.0 Internacional.

Notas:

1

Gracias a Termux, si bien allí lo uso más bien poco. Un Emacs en un móvil o una tableta, aunque sea con un teclado bluetooth, no es precisamente el paraíso.

2

Ojo, porque no es el «deshacer» al que estamos acostumbrados. Lo que entiende Emacs por «deshacer» nos llevaría un tanto lejos de los límites de este modesto artículo.

3

Si queremos hacer una instalación rápida y ya sabemos el nombre del paquete, no haría falta siquiera acceder a la lista completa de los repositorios. Pulsamos M-x package-refresh-contents RET y, acto seguido M-x package-install RET nombre-del-paquete.

© Juan Manuel Macías
Creado con esmero en
GNU Emacs