Una configuración minimalista — algo para comenzar (0x0003)
§¿Cómo se configura Emacs?
Bueno, hay N formas de hacer esto, pero las reduciré a dos.
§La forma antigua: emacs-lisp
Emacs, como ya lo había comentado en el primer video (0x0001), es un intérprete de emacs-lisp
, y por lo mismo está escrito (la mayor parte) y configurado en este lenguaje.
El hecho de que sea un lenguaje de programación y no sólo un formato (como yaml
, toml
, o json
), es que se puede hacer toma de decisiones en la configuración misma, sin tener que depender en todo tiempo de la intervención del usuario.
Por otro lado, hay muchas personas a las que no les gustan los lenguajes Lisp, pero lo mismo se puede decir de cualquier lenguaje de programación.
§La forma moderna: interface customize
Para tratar de facilitar la tarea de configurar emacs para las personas que no son programadores, que no saben emacs-lisp
, o no quieren tomarse la molestia de «programar» su editor de texto, los desarrolladores de Emacs crearon una serie de interfaces para presentar formularios en pantalla que ayuden al usuario a configurar muchas opciones de este programa.
Sin embargo, en el fondo, sigue siendo emacs-lisp
, y aún hay opciones que requieren (si se desea utilizarlas) algo de conocimiento —no muy trivial— de dicho lenguaje de programación.
§La forma que yo estaré utilizando
Como de costumbre, les explicaré lo que utilizo, pero si no les gusta, siéntanse en plena libertad de utilizar otras formas de hacer las cosas. No me voy a pelear por esto, y no creo que nadie necesite pelearse por esto tampoco.
Esto significa, si pusiste antención a mis palabras (y has echado una mirada al repositorio de mi configuración de Emacs), que estaremos configurando Emacs con emacs-lisp
.
§Una configuración minimalista
Para esta configuración de ejmplo comenzaremos con algo bastante sencillo.
§El buffer «borrador»
Por lo pronto, vayamos al buffer *scratch*
. Lo podemos hacer con C-x b *scratch* RET
o con M-x scratch-buffer RET
.
Este buffer no está asociado a ningún archivo y (casi) siempre está disponible en Emacs. Y, como dice ahí mismo:
;; This buffer is for text that is not saved, and for Lisp evaluation. ;; To create a file, visit it with C-x C-f and enter text in its buffer.
Este buffer es para texto que no está guardado, y para evaluación de Lisp. Para crear un archivo, visitalo con C-x C-f e introduce el texto en su buffer.
Y como nos interesa evaluar emacs-lisp
, este es el lugar más apropiado para comenzar a jugar con esta configuración.
Estas primeras dos líneas que están en el buffer son comentarios de emacs-lisp
. Los comentarios inician con un punto y coma (semi-colon, ;
) y terminan con el fin de línea. Pero hay una convensión en que los comentarios que deban abarcar desde el inicio de la línea (en teoría) deben comenzar con dos punto y comas (;;
).
§Cambiar el tema
Ya que a mí me gustan los temas oscuros, lo primero que haremos será evitar que la ventana de Emacs que aparece de pronto en nuestra pantalla nos ciegue.
(load-theme 'wombat t)
Lo anterior es una llamada de función en emacs-lisp
. La función se llama load-theme
y estamos utilizando dos parámetros:
'wombat
, el nombre del tema en forma de símbolot
, una constante que enemacs-lisp
equivale a un valor boleano de verdadero (no del todo cierto, pero por el momento es suficiente explicación).
¿Y porqué estos parámetros? Porque la función tiene tres parámetros:
- THEME
- el nombre del tema
- NO-CONFIRM
- si se desea que Emacs no pida confirmación de cargar este tema.
- NO-ENABLE
- si se desea que Emacs cargue el tema, pero que no lo habilite.
Los últimos dos parámetros (en este caso, en esta función) son opcionales, de modo que no es necesario indicarle a Emacs sus valores si queremos que sean nil
(el equivalente a un boleano de falso).
Para evaluar lo que tenemos en el buffer podemos posicionar el cursor después del último paréntesis de la expresión y teclear C-x C-e
(el comando sería eval-last-sexp
).
§Cambiar el tamaño de la letra
La letra en emacs es demasiado pequeña para que salga bien en mis videos, así que la vamos a cambiar.
(set-face-attribute 'default nil :height 160)
La función (en este caso no es un comando) es set-face-attribute
, y tiene dos parámetros obligatorios:
- FACE
- la fuente (hablando en términos tipográficamente correctos)
- FRAME
- el marco en que queremos aplicar estos cambios a la fuente
Después de estos se espera que haya distintos argumentos, de una cantidad variable. En esta función estos últimos argumentos son los que definen las propiedades de la fuente, la face
, que queremos manipular.
En esta ocasión lo único que nos interesa es cambiar la altura (:height
) de la fuente por defecto ('default
), y lo aplicaremos en todos los marcos (por ello el valor nil
en el segundo parámetro).
§Limpiar la interface visual
Como ya mensioné, en el video anterior (0x0002), yo no utilizo el menú ni la barra de tareas ni la barra de desplazamiento. así que también los eliminaré en este ejemplo.
;; Pasamos un valor negativo a la función `menu-bar-mode'. (menu-bar-mode -1) ;; Pasamos un valor negativo a la función `tool-bar-mode'. (tool-bar-mode -1) ;; Pasamos un valor negativo a la función `scroll-bar-mode'. (scroll-bar-mode -1)
El valor negativo en el primer parámetro para la mayoría de las funciones de modo indica desactivar el modo, que es lo que queremos en este caso.
De manera similar, podemos activar (o desactivar) estas opciones de configuración con C-x C-e
posicionando el cursor después de cada expresión.
§«Creo que ya no necesito la pantalla de bienvenida»
Si tampoco quieres la pantalla de bienvenida de Emacs, puedes poner lo siguiente en tu init.el
:
(setq inhibit-splash-screen t)
En este caso, la función que estamos llamando (en realidad es una «macro», pero, para fines prácticos, por el momento le llamaremos simplemente «función») es setq
, que nos ayuda a darle valor a una variable, a cambiárselo o a crearla si no existe. Es el equivalente a let
en Rust o al operador de asignación (=
) en lenguajes tipo C.
Después del nombre de la función ponemos el nombre de la variable y luego su valor. En este caso estaríamos diciéndole que sí inhiba la pantalla de bienvenida (splash screen), ya que el valor que le estamos dando equivale a un boleano de verdadero.
§«Quisiera que Emacs “supiera” mi nombre»
Existe una variable en Emacs llamada user-full-name
, la cual tiene el nombre de usuario dado al sistema (en los sistemas operativos tipo UNIX equivale al comentario [comment] del registro de /etc/shadow
).
Y Emacs suele utilizar el valor de esta variable en algunas funciones o paquetes para obtener el nombre «real» del usuraio (por ejemplo, para definir el autor de un documento, o el nombre del usuario al mandar un correo electrónico).
Puedes verificar cuál es el valor que Emacs está utilizando al escribir el nombre de dicha variable en el buffer y realizando la misma secuencia de teclas que hemos utilizado para evaluar las funciones: C-x C-e
. Esto debería desplegar el valor de la variable en el minibuffer
.
En mi caso me arroja el siguiente resultado:
user-full-name
§Me cansa mucho estar evaluando línea por línea
Si quieres evaluar todo el buffer puedes hacerlo con el comando eval-buffer
(M-x eval-buffer RET
).
Esto evaluará no sólo una expresión, sino todas las que estén presentes en el buffer.
§¿Dónde escribo mi configuración?
Antes de que cierres Emacs debes saber que todo lo que pongas en el buffer *scratch*
se perderá cuando salgas de Emacs. Así que tendrías que estar tecleando todo cada vez que lo abras. A eso difícilmente se le puede llamar una configuración, al menos no es una configuración práctica.
Primero debes saber que hay una serie de archivos en los que por defecto Emacs buscará su configuración al arrancar. Estos serían los siguientes:
~/.emacs
~/.emacs.el
~/.emacs.d/init.el
~/.config/emacs/init.el
De hecho los busca en este órden específico, y eso puede llegar a ser significativo.
También hay una variable llamada early-init-file
, que indica el nombre de un archivo que buscará antes de estos archivos, pero veremos más detalles de este otro archivo de configuración más adelante.
Para tu configuración te recomiendo que utilices la última opción, ya que es compatible con las recomendaciones de freedesktop.org (XDG). Eso mismo es lo que yo hago, pero para esta configuración modelo, ya que no quiero estar modificando mi propia configuración, guardaré mis archivos en otra ubicación y utilizaré una de las nuevas características de Emacs 29 que es utilizar la opción --init-directory
.
§¿Cómo cargo una configuración en una ubicación alterna?
Quiero enfatizar que lo que pondré en esta sección no es necesario para tener una configuración, sino que lo estaré haciendo para poder demostrar cómo se pudiera hacer.
Con versiones recientes (Emacs 29.1 o posterior) es muy sencillo. Para lo anterior deberemos introducir lo siguiente desde una línea de comandos:
emacs --init-directory="~/Projects/code/emacs"
Supongo que en Windows™ o MacOS™ sería igual, pero como no lo utilizo, no podría afirmarlo sin temor a equivocarme.
§Guardamos nuestra configuración
Guardaremos el contenido del buffer *scratch*
: C-x C-f ~~/.config/emacs/init.el RET
(si has elegido utilizar un directorio alterno —como en mi caso—, tendrías que poner la ruta al archivo init.el
en dicho directorio).
Es probable que te aparezca un mensaje en el minibuffer
indicando que el directorio no existe. Si es así, simplemenete seguiremos la recomendación de emacs y teclearemos lo siguiente para crear el directorio: M-x make-directory RET RET
(sí, dos veces RET
).
Este es un script de emacs-lisp
, y en él podemos poner cualquier expresión válida de dicho lenguaje y Emacs lo ejecutará al iniciar.
§¿Y ahora qué?
Esta es una configuración muy, muy, muy minimalista, pero quería utilizarla para demostrar algunos de los fundamentos de una configuración escrita en emacs-lisp
.
En siguientes videos iremos profundizando poco a poco (y no mucho) en diversos temas de emacs-lisp
.
Puedes acceder a mis notas en mi repositorio: https://git.sr.ht/~abarocio80/videos/tree/master/item/content/0x0003--una-configuracion-minimalista-algo-para-comenzar.org
O en mi página: https://barocio.cc/videos/0x0003--una-configuracion-minimalista-algo-para-comenzar.html
Si te interesa este tipo de contenido, suscríbete al canal y activa las notificaciones para que (tarde o temprano) te enteres de los nuevos videos que vaya subiendo.
Si te interesa, también puedes visitar mi página: https://barocio.cc/, donde pongo las notas de mis videos y otro contenido de mi interés.