Notxor tiene un blog

Defenestrando la vida

Emacs, configuraciones básicas

Notxor
2024-02-02

Aprovechando que estaba dando un repaso a mi configuración de Emacs me he propuesto contar un poco qué paquetes uso y por qué. De paso, espero que a alguien le sirva de inspiración para configurar su entorno. Me repito, puesto que ya indiqué en otro artículo cómo tengo la configuración, que por otro lado puedes consultar en su repositorio: https://codeberg.org/Notxor/init-emacs. Al final, la configuración de cualquier sistema es una toma de decisiones, si hay alternativas. En un sistema como Emacs, donde hay muchas alternativas y, por tanto, decisiones, la tarea de configurarlo puede parecer abrumador al principio.

Emacs es un entorno complejo, no es un editor, es un entorno LISP enfocado a trabajar con texto. Ajustarlo a tus necesidades suele ser el principal quebradero de cabeza de quien empieza a adentrarse en su uso. Por ello han ido apareciendo a lo largo del tiempo algunos paquetes que distribuyen el sistema, con un aspecto más vistoso y con la configuración prácticamente hecha. Me refiero a distribuciones como Doom, Spacemacs, Prelude o Centaur. Además, por supuesto, de la Vanilla: la más básica (y oficial). ¿Cuál recomiendo? Ninguna y todas. En el artículo de hoy voy a hacer un repaso de las herramientas, tanto funcionales como de aspecto, que utilizo en mi día a día y cómo las tengo configuradas en mi init.el. Sí, necesitarás entender algo de LISP para hacer las tuyas.

En mi caso utilizo una instalación básica (Vanilla si lo queréis llamar así), a partir de una compilación de Emacs que hago desde el código fuente, es decir: descargo el código fuente y lo compilo para mi ordenador cada vez que me entero de alguna actualización importante (lo que viene a ser una o dos veces al mes).

Aspecto visual

Debería ser lo último. Es decir, una vez que lo tienes todo funcionando haz que sea bonito. Sin embargo, a muchos les importa qué aspecto tiene la herramienta tanto más que su funcionamiento. Para muestra, un botón:

Captura_ventana-emacs.png

El aspecto visual es subjetivo y por tanto está sujeto más a gustos que a otras consideraciones. Las líneas generales, las mías, serían las siguientes:

  • Simplicidad de la interface: sin menús ni barras de desplazamiento, mucho menos barra de herramientas.
  • Tema oscuro de edición, pero con posibilidad de cambiar a uno claro para visualizar mejor en ambientes más luminosos, como la calle.
  • Modificación de la línea de estado: información y diseño.
  • Directorios, archivos, número de línea e iconos.

Por supuesto, se pueden añadir otros aspectos o eliminar algunos de éstos, como digo estas decisiones son cuestión de gustos. Por ejemplo, no me gustan las tabs para agrupar buffers, rompen el minimalismo de la interface y en su lugar utilizo el paquete perspective. Ya hablé sobre cómo organizar el espacio en una ventana de Emacs y también sobre algunos otros ajustes visuales. Puedes ir a esos artículos para tener más detalles.

La configuración de perspective es muy simple:

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

Con perspective puedo cambiar entre distintas configuraciones de pantalla. Normalmente lo divido por tareas: en la perspectiva main suelo tener activas algunas tareas, como la agenda, la toma de notas, contabilidad y cualquier asunto más o menos trasversal. Luego, en otras perspectivas suelo cargar proyectos o tareas más específicas.

Captura_perspective_main.png

Más adelante en el apartado custom-set-faces modifico también el tipo de letra para resaltar la perspectiva con:

(custom-set-faces
 ...
 'persp-selected-face ((t (:foreground "yellow" :weight normal)))))

El cambio de perspectivas me permite tener varias configuraciones de pantalla sin los tabs, que estéticamente me parecen horribles.

Simplificar la interface

Cuando utilizas GTK fuera de un escritorio Gnome el resultado visual deja mucho que desear. Feo, es feo, muy feo. Para mejorar el aspecto de Emacs en otros escritorios la opción más a mano es eliminar cualquier widget GTK de la ventana. A ser posible todos.

Como digo, las barras de desplazamiento, la barra de herramientas y los menús me sobran. La ventana sin ellas se convierte en algo minimalista, sólo está el texto y la línea de estado, lo cual resulta más agradable que el aspecto que proporcionan los widgets GTK.

En mi archivo de configuración mi-custom-var.el se pueden encontrar las siguientes expresiones que eliminan algunos aspectos de la ventana:

'(column-number-mode t)                 ;Muestra en línea de estado la columna además de la línea
'(custom-enabled-themes '(dracula))     ;Permite cargar el tema oscuro `Dracula'.

'(inhibit-startup-screen t)             ;No muestra la pantalla de inicio por defecto de `Emacs'
'(scroll-bar-mode nil)                  ;Elimina las barras de scroll
'(tool-bar-mode nil)                    ;Elimina la barra de herramientas
'(menu-bar-mode nil)                    ;Elimina el menú (accesible desde `<f10>')
'(global-prettify-symbols-mode t)       ;Activa la sustitución de símbolos de manera global

'(electric-pair-mode t)                 ;Activar el modo de autocierre de paréntesis
'(truncate-lines t)                     ;Las líneas en una línea sin saltos
'(show-paren-mode t)                    ;Remarca la pareja de un paréntesis (corchete, llave)
'(which-key-mode t)                     ;Activa la sugerencia de teclas
'(word-wrap t)
'(org-fontify-emphasized-text t))       ;Activar la visualización de estilos de fuente

No sólo menciono las líneas de simplificación, sino también algunos aspectos y funcionalidades adicionales. Podríamos considerar también algunas cosas más:

(save-place-mode t)                ;Guarda la posición del cursor al cerrar un archivo
(global-auto-revert-mode t)        ;Recarga el contenido de un buffer si ha cambiado el archivo en disco
;; Desplazar los archivos temporales y de backup a directorio temporal
(setq backup-directory-alist
      `((".*" . ,temporary-file-directory)))
(setq auto-save-file-name-transforms
      `((".*" ,temporary-file-directory t)))

En la imagen anterior, se puede observar en la línea de estado las perspectivas abiertas marcadas como [blog|main]. Marca amarilla para la perspectiva en uso (blog), main es la única que está siempre activa y es donde suelo tener cargadas herramientas como la agenda y las notas.

Temas

Muchos afirman que con un buen tema oscuro es suficiente para todo. En mi caso, llevo el ordenador (o la tablet) a sitios donde las condiciones ambientales dificultan la lectura de la pantalla en colores oscuros. Si has trabajado al aire libre alguna vez, sabes de lo que estoy hablando. Por eso, hace tiempo que tengo un método para cambiar de tema oscuro a tema claro y viceversa, pulsando tan sólo una tecla. Ya lo conté en otro artículo, ya enlazado, pero me voy a repetir.

Como se vio antes, como tema oscuro utilizo Dracula. Pero el cambio a una visualización clara utilizo el tema tsdh-light. Para el intercambio, utilizo el paquete heaven-and-hell que permite hacerlo de manera sencilla.

(use-package heaven-and-hell
:ensure t
:init
(setq heaven-and-hell-theme-type 'dark) ;; usa el oscuro por defecto
(setq heaven-and-hell-themes
      '((light . tsdh-light)
        (dark . dracula))) ;; Se puede sustituir por (dark . (tsdh-dark wombat))
;; Opcional, carga el tema sin pedir confirmación
(setq heaven-and-hell-load-theme-no-confirm t)
:hook ((after-init . heaven-and-hell-init-hook)))
;; configuración de la tecla de cambio
(global-set-key (kbd "<f6>") 'heaven-and-hell-toggle-theme)

En mi caso es algo más complejo, puesto que utilizo también el paquete powerline para embellecer un poco la línea de estado. No es una configuración compleja:

;; Mejorando la visualización de la línea de estado
(use-package powerline
  :ensure t
  :config
  (powerline-default-theme)
  (setq powerline-default-separator 'rounded))

Cuando cambia el tema, los caracteres de adorno de la línea de estado no cambien y queden con el tema que ya no corresponde. Por eso añadí un par de funciones extra para el cambio de temas:

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

(defun ajuste-powerline-default-theme ()
  "Hace un reset de la powerline tras cambiar al tema por defecto."
  (interactive)
  (heaven-and-hell-load-default-theme)
  (powerline-reset))

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

Pijotadas varias

Otro paquete que puede ser útil nos permite visualizar de manera rápida dónde está el cursor en un buffer cuando cambiamos a él y obligar a nuestros ojos a dirigirse al punto:

;; Resalte de la posición del cursor al cambiar de `buffer'
(use-package beacon
  :ensure t
  :config
  (beacon-mode t))

Otra configuración especial es el número de la línea. Cuando estoy programando se me hace un modo fundamental, pero algunas veces me estorba. Por ello tengo algunas consideraciones previas, teclas que me permiten activarlo o desactivarlo y algún aspecto más. Por ejemplo:

(setq display-line-numbers-type 'visual)    ;Muestra el número de línea y la distancia de anteriores y posteriores
(add-hook 'prog-mode-hook 'display-line-numbers-mode)
(global-set-key (kbd "C-c l") 'display-line-numbers-mode)

El modo visual de los números de línea no se limita a mostrar la línea y ya. Muestra el número de línea donde se encuentra el cursos y las demás las numera por la distancia con la actual. De esa manera, se facilitan saltar varias líneas mediante un sólo comando.

Por último, también utilizo un modo de dired que me muestra una barra lateral con directorios y archivos. Además de toda la funcionalidad de un buffer dired permite navegar por los directorios y abrir archivos, tanto con ratón como con teclado. Si le añades los iconos, tienes una buena herramienta de navegación y edición.

;; Ajustes de dired-sidebar
(use-package dired-sidebar
  :ensure t
  :defer t
  :commands (dired-sidebar-toggle-sidebar)
  :init
  (setq dired-sidebar-theme 'nerd)
  (setq dired-sidebar-use-term-integration t)
  (setq dired-sidebar-use-custom-font t))

(use-package dired-git
  :ensure t)

(use-package all-the-icons
  :ensure t)
(use-package all-the-icons-dired
  :ensure t)
(use-package all-the-icons-ibuffer
  :ensure t
  :init (all-the-icons-ibuffer-mode t))

También puedes establecer una combinación de teclas para activar esa barra. En mi caso:

(global-set-key (kbd "C-c s") 'dired-sidebar-toggle-sidebar)

Si después de instalar estos paquetes, no consigues ver correctamente los iconos, es porque te faltan las fuentes. Acuérdate de instalarlas con M-x all-the-icons-install-fonts.

Hay otros paquetes como dashboard para sustituir el buffer de inicio por algo más vistoso. Pero eso lo dejamos para otros momentos. Es mucho más interesante la funcionalidad del editor y, por tanto, vamos a ello.

Funcionalidad: ivy, counsel, swiper y yasnippet

Estos paquetes forman un conjunto imprescindible para mí. El primero de ellos es ivy. Proporciona un sistema de búsqueda y completado en el minibuffer que facilita la edición de comandos de Emacs y junto con los otros, especialmente counsel y swiper nos permite una flexibilidad maravillosa. La alternativa a ivy es helm, que sirve básicamente para lo mismo. Yo me encuentro más cómodo con ivy, pero es bueno saber que existen alternativas.

;; Configurar ivy
(use-package ivy
  :ensure t
  :init
  (setq ivy-use-virtual-buffers t
        ivy-height 15                             ; muestra 15 líneas de información (por defecto son 10)
        ivy-count-format ""                       ; no mostrar el contador
        ivy-initial-inputs-alist nil)
  :config
  (ivy-mode t))
;; Para utilizar iconos
(use-package all-the-icons-ivy
  :init (add-hook 'after-init-hook 'all-the-icons-ivy-setup))
;; Completa la información mostrada en forma de tablas
(use-package all-the-icons-ivy-rich
  :ensure t
  :init (all-the-icons-ivy-rich-mode t))
(use-package ivy-rich
  :ensure t
  :config
  (ivy-rich-mode t))

(defun ivy-rich-switch-buffer-icon (candidate)
  (with-current-buffer
      (get-buffer candidate)
    (let ((icon (all-the-icons-icon-for-mode major-mode)))
      (if (symbolp icon)
          (all-the-icons-icon-for-mode 'fundamental-mode)
        icon))))
;; Modifica la visualización de `ivy' en columnas
(setq ivy-rich-display-transformers-list
      '(ivy-switch-buffer
        (:columns
         ((ivy-rich-switch-buffer-icon (:width 2))
          (ivy-rich-candidate (:width 30))
          (ivy-rich-switch-buffer-size (:width 7))
          (ivy-rich-switch-buffer-indicators (:width 4 :face error :align right))
          (ivy-rich-switch-buffer-major-mode (:width 12 :face warning))
          (ivy-rich-switch-buffer-project (:width 15 :face success))
          (ivy-rich-switch-buffer-path (:width (lambda (x) (ivy-rich-switch-buffer-shorten-path x (ivy-rich-minibuffer-width 0.3))))))
         :predicate
         (lambda (cand) (get-buffer cand)))))
(setq all-the-icons-ivy-rich-icon t)
(setq all-the-icons-ivy-rich-color-icon t)
(setq all-the-icons-ivi-rich-icon-size 1.0)
(setq all-the-icons-ivy-rich-field-width 80)

El paquete counsel nos permite sustituir algunos comandos por homólogos. Sin embargo, puesto que lo utiliza ivy no tengo ninguna configuración especial para él, sólo me aseguro de que esté instalado y le añado una combinación de teclas para moverme por los documentos gracias a counsel-imenu o realizar un búsqueda en el buffer mediante grep:

(use-package counsel
  :ensure t)
(global-set-key (kbd "C-c g") 'counsel-grep)
(global-set-key (kbd "C-c m") 'counsel-imenu)

counsel proporciona bastantes comandos de sustitución, además de para grep o imenu, también puede gustarte el counsel-find-file u otros, es cuestión de probarlos y ver si te va bien asignarles combinación de tecla o no.

Como se muestra en la configuración, yo utilizo para buscar en el buffer que estoy editando con counsel-grep, para realizar la búsqueda (lo que es más rápido si es en un buffer grande) pero también, si el buffer es más pequeño, puedo utilizar la funcionalidad swiper.

swiper ni siquiera lo configuro. Se instala como dependencia de counsel de hecho. Lo descubrí por el comando counsel-grep-or-swiper, que utiliza una búsqueda u otra dependiendo del buffer abierto.

Por otro lado, hablando sobre búsquedas, hay veces que necesitas buscar en varios buffers. Para eso, suelo utilizar projectile-grep o bien project-find-regexp, pero esto lo hablaré en el apartado de programación, porque son herramientas enfocadas a esa actividad.

Otro paquete que utilizo bastante es yasnippet. Muchas de las tareas de edición presentan estructuras repetitivas, especialmente en programación, pero no sólo ahí y este paquete me proporciona, de manera sencilla plantillas que me ahorran bastante tecleo:

;; gestión de plantillas `yasnippet'
(use-package yasnippet
  :ensure t
  :defer t)

;; para que se entiendan `ivy' y `yasnippet'.
(use-package ivy-yasnippet
  :ensure t
  :defer t)

;; colección de plantillas para `yasnippet'
(use-package yasnippet-snippets
  :ensure t
  :defer t)

;; activar `yasnippet' automáticamente donde lo necesito
(add-hook 'org-mode-hook 'yas-minor-mode)
(add-hook 'prog-mode-hook 'yas-minor-mode)

;; asociar combinación de teclas para mostrar lista de snippets
(global-set-key (kbd "C-c y") 'ivy-yasnippet)

Otro paquete importante para mí es which-key. Uso Emacs a diario y, aún así, no consigo acordarme de todas las combinaciones de teclas que lanzan comandos en el editor. Sólo recuerdo algunas decenas de las que utilizo todos los días. A otras, de uso menos frecuente, accedo mediante la llamada a M-x <comando> y otras, me resulta más cómodo que Emacs (ivy en mi caso) me vaya soplando qué funciones tengo accesibles según la combinación que voy tecleando. Esa es la función del paquete which-key. Su configuración es sencilla, me aseguro de que está y lo tengo activado siempre:

(use-package which-key
  :ensure t
  :init
  (which-key-setup-minibuffer)
  (which-key-mode))

Hasta aquí, la funcionalidad general de Emacs para ejecutar comandos del editor, realizar búsquedas de texto o de comando y trabajar con plantillas que nos ahorran tiempo.

Programación: alternativas

Hablo de alternativas porque últimamente se ha extendido entre los programadores la utilización de servidores LSP para la diversas funcionalidades implicadas en la escritura de código, convirtiendo el editor en un mero cliente de ese servidor. Emacs también proporciona entre los paquetes internos un cliente para este tipo de servidores: eglot. También existe otro paquete llamado lsp-mode que realiza funciones similares a eglot1.

Si esa es tu forma de programar, descarga los LSP para los lenguajes que utilices habitualmente y configura eglot (para los lenguajes más habituales, seguramente no tendrás que hacer nada) y ponte a trabajar. En este blog también puedes encontrar información sobre eglot.

He probado LSP, pero al final no me ha convencido: dependes de una aplicación externa, que no siempre funciona porque tiene sus configuraciones y sus cadaunadas que me suelen molestar más que ayudar. Al final siempre vuelvo a modo clásico: configurar el editor para el trabajo. Por otro lado, tanto eglot como lsp-mode terminan tirando de los paquetes tradicionales: projectile o project para la gestión de proyectos, modos para coloreado de sintaxis e indentado, company o auto-complete para el autocompletado de términos, eldoc para mostrar la ayuda, etc. Es decir, si al final voy a utilizar esos mismos paquetes, ¿para qué voy necesito meter una aplicación externa haciendo de intermediaria?

Lo que me lleva a pensar: ¿Qué funcionalidades necesito en mi editor para programar?:

  • Gestión de proyectos
  • Coloreado de sintaxis
  • Completado
  • Ayuda en línea
  • Comprobación de errores

Gestión de proyectos

Si vienes de la utilización de algún IDE, puede parecerte escaso el arsenal de herramientas de un simple editor. La desventaja de un IDE es que suele estar diseñado o acondicionado para un determinado lenguaje o tipo de proyectos. Es decir, proporciona toda la funcionalidad necesaria para su nicho de programación pero abandona el resto. La funcionalidad del IDE en estos tiempos modernos se ha delegado en programas externos, los servidores LSP y convirtiendo el IDE en un mero cliente de esos programas. Como he dicho antes, puedes convertir Emacs en un cliente LSP, pero hay otras alternativas.

Entre los paquetes built-in hay un par que nos facilitan la gestión de proyectos: EDE y project. El objetivo del primero es convertir Emacs en un IDE. Funciona, como otros IDE, creando un archivo de proyecto donde guarda información sobre el mismo. Por el contrario, project es mucho menos ambicioso y entiende que un proyecto está donde haya un repositorio de código.

Sin embargo, me decanté por projectile. Es un paquete similar a project pero con más funcionalidades

;; Configuración para projectile
(use-package projectile
  :ensure t
  :bind-keymap (("C-c p" . projectile-command-map))
  :init
  (setq projectile-project-search-path '("~/proyectos/"))
  (setq projectile-completion-system 'ivy)
  (projectile-mode t))
;; comprobación de sintaxis para `projectile'
(use-package flycheck-projectile
  :ensure t
  :defer t)

Sin ser exhaustivo, las principales funciones que esperas de un IDE las puedes encontrar en ese paquete:

  • Búsqueda de archivos del proyecto.
  • Búsqueda de términos, funciones, variables en los archivos del proyecto.
  • Reemplazo de términos a lo largo de los archivos del proyecto.
  • Gestión de directorios y archivos (con dired).
  • Acceso a una shell para el proyecto (con eshell).
  • Compilar el proyecto, ejecutarlo...
  • Ejecutar comandos de shell en el directorio del proyecto.
  • Acceso al repositorio de código del proyecto.

En fin, toda esa funcionalidad que necesitamos cuando estamos programando.

Con los modos hemos topado

Efectivamente, para el resto de funciones necesarias para programar, necesitamos tener claro en qué lenguaje(s) lo vamos a hacer. Por defecto, Emacs viene con bastantes lenguajes de fábrica, c/c++, asm, emacs-lisp, scheme, java...

Otros lenguajes necesitarán que instales su correspondiente modo. ¿Qué proporciona un modo?:

  • Coloreado de sintaxis.
  • Indentado del código siguiendo la costumbre generalizada del lenguaje.
  • Comandos habituales del lenguaje, junto con sus combinaciones de teclas y menús gráficos.

Como se puede apreciar es bastante escaso, añadiendo además la historia de las indentaciones forzadas por el modo. Algo, que descoloca mucho a usuarios nuevos que vienen de otros editores donde tienen la costumbre de hacer de su capa un sayo e indentar como a ellos les parece.

Si alguien tiene curiosidad sobre los modos y cómo se programa uno, en este blog puede encontrar cómo programar un modo menor y su continuación sobre teclas y menús, aunque también sobre la programación de un modo mayor... por si alguna vez le hiciera falta.

Autocompletado

Mientras programamos es muy útil que el sistema nos vaya sugiriendo alternativas de lo que podemos o no escribir: no sólo nos ahorra unas pocas pulsaciones de teclas, sino que, además, nos evita errores de tecleo, algo inevitable cuando escribes deprisa.

De nuevo tienes que elegir entre dos alternativas: company y auto-complete. La mayoría de lenguajes están soportado por ambas. Aunque puedes encontrar algunos lenguajes que sólo están soportados por una de las opciones y, en ese caso, te ahorras tener que elegir. En mi caso utilizo company. Además de los paquetes generales hay que instalar su correspondiente company-<lenguaje> o ac-<lenguaje> para dar mejor soporte al autocompletado. En mi caso utilizo company y lo tengo activado de manera general.

;; paquete de autocompletado
(use-package company
  :ensure t
  :init
  (setq company-tooltip-align-annotations t)
  :config
  (global-company-mode t))
;; para utilizar iconos en los desplegables de autocompletado
(use-package company-box
  :ensure t
  :defer t
  :after company
  :hook 'company-mode-hook 'company-box-mode)

Documentación en línea

Otra de las herramientas que son muy útiles, sobre todo a la hora de programar, es contar con un chivato que nos indique qué parámetros tiene una función o incluso qué es lo que hace. Para realizar estas funciones contamos con el paquete eldoc, que es otro de esos paquetes que no necesitas hacer nada, porque vienen con la distribución por defecto de Emacs, sólo activarlo cuando lo utilices. Si es como en mi caso, que quiero que esté activo siempre, puedes activarlo de manera global:

(global-eldoc-mode t)

De este modo mostrará, bajo la línea de estado la información con la que cuente el sistema. Por ejemplo, trabajando en org-mode al situar el cursor en la primera línea de un bloque de código, nos muestra en el minibuffer la información de las alternativas.

Captura_eldoc.png

Si prefieres que dicha información la muestre en un marco junto al cursor, puedes instalar también el paquete eldoc-box:

(use-package eldoc-box
  :ensure t
  :defer t
  :init (setq eldoc-box-hover-mode t))

Comprobación de errores

En este caso hablaré de dos vertientes: la primera está relacionada con la escritura de textos y la segunda con la escritura de código. Ambos casos al vuelo (fly): flyspell y flycheck.

En el caso de la escritura de textos, como los artículos de este blog, tener activado el diccionario al vuelo que me avise de errores de tecleo es una ayuda extraordinaria. El modo flyspell viene también entre las utilidades incluidas en la distribución por defecto de Emacs. Los únicos ajustes que hago son los del idioma y la aplicación de corrección. Puesto que utilizo más frecuentemente el español, lo configuro a ese idioma, aunque luego también se podrá cambiar el diccionario, según la lengua en la que estés trabajando. Por tanto, en el archivo de mi-custom-var.el tengo las siguientes entradas:

'(ispell-dictionary "espanol")
'(ispell-program-name "aspell")
'(ispell-list-command "--list")

Por supuesto, lo utilizo principalmente cuando escribo texto, así que tengo también configurado un gancho para que al entrar en cualquier modo de texto se active flyspell:

(add-hook 'text-mode-hook 'turn-on-flyspell)

En el caso de la escritura de código mi elección personal ha sido utilizar flycheck. Hay otro paquete, flymake, que viene por defecto con Emacs, sin embargo, soporta muchos menos lenguajes de programación que flycheck y sus explicaciones sobre errores son inexistentes. En ese sentido, la información que brinda flycheck es mucho más completa y te ayuda en la corrección de errores.

;; configuración para flycheck
(use-package flycheck
  :ensure t
  :defer t)
(add-hook 'prog-mode-hook 'flycheck-mode)

Conclusiones

Hecho el repaso general, como digo, muchos aspectos dependen de gustos. Cuando llevas un tiempo trabajando con un sistema tienes más oportunidades para hacer pruebas, ver si te convence más o menos una determinada herramienta. Al final son decisiones personales que tomas por motivos también personales.

Espero que este artículo pueda servir a quien se introduce en Emacs a tener una perspectiva general sobre la configuración. Algo que a muchos puede parecer abrumador, dada la cantidad de opciones, detalles y aspectos que se pueden ajustar.

Notas al pie de página:

1

Podéis encontrar la información aquí https://emacs-lsp.github.io/lsp-mode/

Categoría: 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 esta cuenta de Mastodon, también en esta otra cuenta de Mastodon y en Diaspora con el nick de Notxor.

Si usas habitualmente XMPP (si no, te recomiendo que lo hagas), puedes encontrar también un pequeño grupo en el siguiente enlace: notxor-tiene-un-blog@salas.suchat.org

Disculpen las molestias.