Notxor tiene un blog

Defenestrando la vida

Algunos ajustes para Emacs

2022-04-06

Algunas veces doy por sentado que todo el mundo conoce lo que yo sé, porque lo que sé lo he adquirido leyendo y leer sabemos todos. Eso hace que muchas veces no hable, bueno, más bien no escriba, sobre algún apartado que puede ser interesante para otras personas, que quizá no conozcan las posibilidades que ofrece, o se están iniciando, en Emacs. En algunos sitios, foros o grupos de internet en los que participo se han comentado cosas, se han hecho peticiones de información y se ha hablado de aspectos que, en mi ingenuidad, pensé que todo el mundo conocía. Uno de los temas es el recurrente control del tema, el aspecto, de Emacs, cosas como, por ejemplo, cambiar el tema pulsando una tecla, o cómo configurar las fuentes de caracteres o el tipo de fuente que utilizamos. Y por último, otro de los aspectos que trataré en este artículo es el que más me sorprende, porque creí que todo el mundo conocía: la capacidad de agrupar buffers en perspectivas de manera que al cambiar de perspectiva cambiará la distribución de nuestro marco en Emacs. Me sorprende porque todo el mundo, especialmente los recién llegados, parecen conocer las pestañas que nos brinda Emacs desde hace relativamente pocas versiones (y que no alcanza lo que la gente espera), pero desconocen las perspectivas, que son generalmente lo que necesitan.

Concretamente, hablaré de tres cosas, dos son paquetes que utilizo y que me resultan muy útiles:

El otro tema, el de los tipos de fuentes, tiene más que ver con los gustos personales que con la funcionalidad propiamente dicha, pero también hay alguna consideración técnica que hacer.

Heaven and Hell y otros aspectos visuales

Este paquete es bastante pequeño, apenas unas pocas líneas de código que nos permiten cambiar el theme de Emacs al vuelo. Nos permite cambiar entre un fondo claro y uno oscuro sin mucha dilación. Hay veces que trabajo en sitios muy iluminados, o incluso la calle, donde se ajustan mejor, o son más legibles, si lo queréis expresar así, los temas claros. En cambio, en otras ocasiones, por ejemplo, por la tarde-noche o con iluminación más pobre, los fondos claros molestan a la vista y me cansan. Entrar en las opciones del tema y cambiarlo no lleva mucho tiempo. Sin embargo, este paquete me permite cambiar entre un fondo claro y otro oscuro pulsando F6. Eso es algo que a mí me resulta muy útil.

Sólo configuro dos teclas:

  • C-c F6: Desactiva el theme y vuelve a mostrar el tema por defecto de Emacs, como si no hubiéramos instalado ninguno.
  • F6: Cambia entre los temas claro y oscuro definidos en la lista de temas en la variable del paquete heaven-and-hell-themes.

Se puede iniciar Emacs con el tema claro o con el oscuro, dependiendo del valor de la variable heaven-and-hell-theme-type que se configura también en el arranque.

El código de configuración está un poco retocado con respecto a la página del paquete, ahora explicaré por qué:

;; Intercambiar tema claro y oscuro
(use-package heaven-and-hell
  :ensure t
  :init
  (setq heaven-and-hell-theme-type 'light) ;; 'dark) ;; Omit to use light by default
  (setq heaven-and-hell-themes
        '((light . tsdh-light)
          (dark . dracula))) ;; Themes can be the list: (dark . (tsdh-dark wombat))
  ;; Optionall, load themes without asking for confirmation.
  (setq heaven-and-hell-load-theme-no-confirm t)
  :hook (after-init . heaven-and-hell-init-hook))

(defun ajuste-powerline-theme ()
  "Hace un reset de la powerline tras cambiar el tema."
  (interactive)
  (heaven-and-hell-toggle-theme)
  (powerline-reset))

(global-set-key (kbd "C-c <f6>") 'heaven-and-hell-load-default-theme)
(global-set-key (kbd "<f6>")     'ajuste-powerline-theme)

El cambio fundamental es que he sacado la configuración de las teclas fuera de la forma use-package porque necesitaba un ajuste especial. En concreto, también utilizo el paquete powerline. Al intercambiar entre el modo claro y el modo oscuro el carácter separador de los campos de la línea de estado quedan dibujados con el mismo color del tema anterior, porque no los actualiza el theme sino que debe hacerlo powerline.

Captura_linea-powerline.png

Para que el tema ajuste bien, tras el cambio, hay que hacer un powerline-reset. Por tanto, en lugar de ejecutar sólo el cambio de color del theme hay que ejecutar también un redibujado de la línea de estado:

(defun ajuste-powerline-theme ()
  "Hace un reset de la powerline tras cambiar el tema."
  (interactive)
  (heaven-and-hell-toggle-theme)
  (powerline-reset))

Este paso no es necesario si no utilizamos el paquete powerline o tendréis que ajustarlo si utilizáis algún otro embellecedor de la línea de estado.

Por otro lado, por algún motivo que (aún) no comprendo, si ejecuto package-autoremove siempre desinstala heaven-and-hell, por lo que algunas veces se demora el arranque ya que use-package lo tiene que volver a descargar e instalar. En fin, tampoco llega la sangre al río, aunque a veces es algo molesto.

Perspective

Agrupa buffers en perspectivas de manera que al cambiar de una a otra modifica la distribución de buffers en el marco. Una buena idea, y es lo que yo hago, es utilizar una perspectiva para cada proyecto que tengamos abierto. De esa manera podrás tener buffers del mismo tiempo, por ejemplo magit y sabrás exactamente a qué proyecto está asociado.

Si lo tienes activos, al arrancar Emacs siempre se crea la perspectiva main (el nombre es configurable y podemos cambiarlo como casi todas las cosas de Emacs). La perspectiva main la suelo utilizar para visualizar la información no relacionada con ningún proyecto ni actividad. Como por ejemplo, consultar la agenda, mostrar el dashboard.

Podemos ver una serie de capturas de tres perspectivas abiertas. Cada una con sus buffers.

Captura_persp-main.png
Captura_persp-prog.png
Captura_persp-blog.png

Como podéis apreciar, en la línea de estado aparece una lista de las perspectivas. Por defecto, los caracteres que se utilizan son los corchetes [...] con el separador |, pero se puede establecer cualquiera otros. También se puede configurar el aspecto de la lista, como el color de las perspectivas y también el de la perspectiva activa.

El código de configuración es también muy simple.

(use-package perspective
  :ensure t
  :init
  (persp-mode t))

El aspecto de cómo se mostrará la perspectiva activa se configura en el apartado custom-set-faces. Pongo toda la forma aquí, aunque también engloba algunos aspectos que comentaré en el apartado siguiente, sobre los tipos de letra:

(custom-set-faces
 ;; custom-set-faces was added by Custom.
 ;; If you edit it by hand, you could mess it up, so be careful.
 ;; Your init file should contain only one such instance.
 ;; If there is more than one, they won't work right.
 '(default ((t (:family "DejaVu Sans Mono" :foundry "PfEd" :slant normal :weight normal :height 98 :width normal))))
 '(org-level-1 ((t (:inherit outline-1 :height 1.0))))
 '(org-level-2 ((t (:inherit outline-2 :height 1.0))))
 '(org-level-3 ((t (:inherit outline-3 :height 1.0))))
 '(org-level-4 ((t (:inherit outline-4 :height 1.0))))
 '(org-level-5 ((t (:inherit outline-5 :height 1.0))))
 '(org-level-6 ((t (:inherit outline-6 :height 1.0))))
 '(org-tree-slide-heading-level-1 ((t (:inherit outline-1 :weight bold :height 3.5))))
 '(org-tree-slide-heading-level-2 ((t (:inherit outline-2 :weight bold :height 2.5))))
 '(org-tree-slide-heading-level-3 ((t (:inherit outline-3 :weight bold :height 1.5))))
 '(persp-selected-face ((t (:foreground "yellow" :weight normal)))))

Como dice el comentario del código, el código está añadido por el comando custom y agrupa comportamientos de fuentes de varios paquetes. La primera línea ejecutable del bloque identifica el tipo de letra establecido por el menú default-font. Luego comentaré por qué he seleccionado DejaVu Sans Mono.

Las siguientes 6 líneas establecen el tamaño del texto de las cabecera de org-mode. Por defecto, algunos temas dibujan tamaños más grandes de fuente para las cabeceras. Algo que, a mí concretamente, no me gusta nada y por eso en todos los casos utilizo :height 1.0. No así en el modo de presentación del paquete org-tree-slide. Por último, modifico la visualización de la perspectiva seleccionada, con un color de texto amarillo. Por defecto es de color azul y el peso de la fuente es en negrita. Con fondo gris en la línea de estado se suele percibir más como un borrón azul casi ilegible que como texto. Por eso, prefiero un peso normal del tipo y un color claro, que no sea blanco.

Por defecto, la combinación de teclas de perspective es C-x x, que nos abre todo un abanico de acciones que podemos hacer con las perspectivas. Las principales, o las que yo más utilizo, son:

tecla comando acción
C-x x s persp-switch Cambiar a otra perspectiva, la crea si no existe.
C-x x c persp-kill Cierra la perspectiva y todos los buffers asociados.
C-x x n persp-next Ir a la perspectiva siguiente.
C-x x p persp-prev Ir a la perspectiva anterior.
C-x x r persp-rename Renombrar la perspectiva.
C-x x b persp-switch-to-buffer Cambiar al buffer de la perspectiva.
C-x x m persp-merge Mezclar los buffers de la perspectiva actual con otra.

También podemos ir directamente de una perspectiva a otra utilizando su número, asignándolo por orden tal y como aparecen ordenadas en la línea de estado. Por defecto, se ordenan alfabéticamente y podemos saltar utilizando C-x x y el dígito del orden de la perspectiva del 1 al 0. En este último caso corresponde a la perspectiva 10. Se pueden tener más perspectivas abiertas. En ese caso, se puede utilizar la combinación C-x x `, pedirá un número y saltará a la correspondiente... sé que existe esta opción, pero normalmente no llego a tal cantidad de perspectivas en danza, suelo tener dos o tres, o como mucho cinco perspectivas abiertas, así que no es algo que suela usar.

Hay alguna función más, pero no las he usado nunca o casi nunca... vamos, que no recuerdo haberlas necesitado. Mi costumbre habitual es abrir una perspectiva que suele coincidir con el proyecto o labor que esté realizando. Al cerrar una perspectiva con C-x x c automáticamente se cerrarán todos los buffers relacionados con dicha perspectiva y preguntará, en caso de que sea necesario, si queremos guardar aquel que haya sido modificado. Cada perspectiva conserva la distribución de buffers que le hayas puesto.

Por otro lado, cada una de las perspectivas tiene su buffer *scratch*, que nos permite trabajar en varios proyectos con pruebas de código diferenciadas.

Tipos de letra

Algunas veces miramos cómo podemos tener un tipo de letra vistoso y hay algunos muy bonitos, pero que no siempre sirven para programar. Sin embargo, algunas otras están diseñadas precisamente para esa tarea ¿cuál elegir? ¿Qué tipo de letra utilizo? Algunos también me lo han preguntado, y alguna vez creo que ya hablé sobre el tema. En mi caso los criterios son varios, más allá de que debe ser un tipo de fuente fija o mono, concretamente a la fuente que utilizo le pido:

  • Distinguir claramente los caracteres 1, l, I y O, 0.
  • Disponer de caracteres especiales. Recordad que también escribo en Esperanto y se utilizan caracteres como ĉ, ĥ, ĵ, ŝ, ŭ...
  • En los ficheros de org-mode, debe soportar la utilización de itálica, negrita, etc. Algunos tipos de letra no lo hacen y muestran los modos especiales subrayados (algo que me sobrerraya a mí).

La primera de estas condiciones es imprescindible cuando vamos a programar y supongo que ya la mayoría de vosotros lo tiene en cuenta como yo. Fuentes que cumplen con esta condición hay infinidad y podemos elegir entre muchas. Si es el único criterio que tenéis en cuenta cualquier fuente que esté diseñada para programadores os servirá. Sin embargo, el siguiente criterio es más raro entre las fuentes diseñadas para programar. Incluso pueden carecer de tildes, porque algunos creadores de fuentes sólo contemplan el idioma inglés para esa actividad. Por otro lado, la condición de tener un catálogo de caracteres completo, lo cumplen también las fuentes que utilizo en este blog, sin embargo, no podría programar cómodamente utilizándolas para tal fin. Para mí es importante que las fuentes tengan esos caracteres especiales y por tanto tengo que utilizar una fuente fija (o mono) que los contenga, no me sirven todas. Por último, la tercera condición, viene del hecho de que utilizo el modo texto, y concretamente org-mode para mi trabajo diario y me gusta la que la visualización sea correcta. Por ejemplo, Fira Code sería otra fuente a tener en cuenta que cumple con las dos primeras condiciones, y configurada en Emacs queda bastante vistosa, pero no cumple la tercera condición.

Para no darle demasiadas vueltas al asunto, la fuente que utilizo yo es DejaVu Sans Mono, como se pudo apreciar el bloque de código de mi init.el. No es una fuente moderna de esas que les gustan a los Hipsters, sin embargo cumple los requisitos anteriores y a mí me resulta agradable de leer. No necesito hacer ningún esfuerzo para diferenciar una palabra de otra ni una letra de otra.

Conclusiones

El flujo de trabajo se beneficia mucho de las perspectivas, permitiendo abrir y cerrar funcionalidad sin necesidad de modificar nuestro marco de trabajo. Simplemente se abre una nueva perspectiva se utilizan los buffers que sean necesarios y cuando se termina dicha necesidad, al cerrar la perspectiva, todo queda como estaba. Otro uso que le doy es, por ejemplo, utilizar las perspectivas para separar tareas como leer el correo o los feeds, o chatear cuando utilizo(aba) erc. O estás programando en una perspectiva y en otra documentando lo que haces. Por poner una analogía, sería como la funcionalidad que nos ofrecen los terminales (o escritorios en modo gráfico) de GNU/Linux, en cada uno podemos tener abiertas nuestras aplicaciones y podemos saltar de uno a otro con una combinación de teclas.

Espero que estas pocas explicaciones os sean útiles.

Categoría: Emacs perspective themes-emacs

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.