Cambios de Emacs 31 que ya uso todos los días
(rahuljuliato.com)- Emacs 31 todavía no se lanza oficialmente, pero tanto en la rama
emacs-31como enmasterya se están acumulando cambios perceptibles, y varias configuraciones se están moviendo hacia una dirección en la que se resuelven solo con el core de Emacs, sin paquetes externos - Con la llegada del cambio automático a Tree-sitter y la instalación de gramáticas, baja la carga de tener que gestionar manualmente los major modes y las fuentes de gramática
markdown-ts-mode, el renderizado de documentación de Eglot,eldoc-help-at-pt, la finalización eager yxref-edit-moderefuerzan el flujo de edición, navegación y consulta de documentación con foco en funciones integradas- Opciones pequeñas como la side window de Speedbar, el autoocultado de VC, las condiciones de logs de ERC,
kill-region-dwim,ielm-history-file-nameynative-comp-async-on-battery-powerreducen fricciones repetitivas - Los nombres de funciones y valores por defecto de Emacs 31 todavía pueden cambiar, y
markdown-ts-modejunto con el renderizado de documentación de Eglot que lo usa están marcados como funciones experimentales, por lo que hay que activarlos explícitamente
Premisas de esta vista previa de Emacs 31
- Emacs 31 todavía no se ha lanzado, y el entorno de referencia es una configuración usada hacia mediados de 2026 compilando las ramas
emacs-31ymaster - Los puntos presentados son cambios incorporados en la configuración diaria real, y en su mayoría ya entraron al core de Emacs o están muy cerca de hacerlo
- Los nombres de funciones y los valores por defecto pueden cambiar hasta la versión final
- Los ejemplos de configuración se pueden ver en el
init.elde Emacs Solo bajo el comentario; EMACS-31
Menos configuración de Tree-sitter
- En Emacs 31, dos opciones simplifican el cambio a modos basados en Tree-sitter y el flujo de instalación de gramáticas
treesit-enabled-modes ttreesit-auto-install-grammar t
- Si
treesit-enabled-modesse deja ent, los major modes que tengan variante Tree-sitter pasarán a usar esa variante treesit-auto-install-grammarya no solo lanza un error cuando falta una gramática, sino que propone que Emacs la descargue y la compile- Como las fuentes de gramática de lenguajes como TypeScript, TSX, Rust, TOML, YAML y Dockerfile vienen dentro de los modos, se reduce la necesidad de poner manualmente URLs y rutas en
treesit-language-source-alist - Si se usa un directorio compartido de Emacs entre varias arquitecturas, hay que tener cuidado
- Las gramáticas instaladas automáticamente no se separan por arquitectura
- Los
.sodex86_64yarm64quedan bajo el mismo nombre, así que un binario compilado en una máquina puede no cargarse en otra
markdown-ts-mode integrado
- Emacs 31 incluye el experimental
markdown-ts-mode - Este modo nació a partir de una propuesta enviada a emacs-devel a inicios de 2025, y después Stéphane Marks se sumó como coautor para seguir mejorándolo
- Trata Markdown no solo como algo para resaltar sintaxis, sino como un entorno de edición más cómodo para escribir y leer
- Ofrece navegación por encabezados, plegado y movimiento entre elementos estructurales, algo familiar para quienes usan Org
- Los fenced code blocks no se muestran como texto monoespaciado plano, sino que reciben font-locking con el major mode real del lenguaje correspondiente
- Los bloques de Emacs Lisp y otros modos integrados también pueden recibir resaltado de sintaxis real
- Los comandos para editar bloques de código funcionan en buena medida, aunque la finalización dentro de los bloques todavía se siente algo verde
- Los enlaces a imágenes se renderizan en línea dentro del buffer
- Todavía no está conectado a
auto-mode-alist, así que no toma archivos.mdautomáticamente- Se puede cargar la librería con
M-x load-library RET markdown-ts-modey activarlo en el buffer - También se puede agregar manualmente a
auto-mode-alist
- Se puede cargar la librería con
- El feedback se puede enviar a la lista de bugs con
M-x report-emacs-bug - Hay capturas adicionales en el demo de markdown-ts-mode-lab
Mejoras en Eglot, Eldoc y completion
- En Emacs 31, Eglot puede renderizar documentación LSP con
markdown-ts-view-modeeglot-documentation-renderer 'markdown-ts-view-mode- Permite ver hover docs formateados sin paquetes externos
- Como depende de
markdown-ts-mode, esta función también es experimental
- Con
eglot-code-action-indicationsse pueden apagar las nuevas pistas inline de code actions- En algunos language servers estas pistas pueden sentirse demasiado ruidosas
eglot-events-buffer-sizeestá siendo reemplazado poreglot-events-buffer-configeldoc-help-at-pt tmuestra ayuda del elemento bajo el cursor sin invocarla por separado- Si se usa junto con
eldoc-echo-area-prefer-doc-buffer, aumenta la guía al explorar código desconocido
- Si se usa junto con
- Las nuevas opciones de completion actualizan la UI de forma más activa mientras se escribe
completion-eager-update tcompletion-eager-display 'autominibuffer-visible-completions 'up-down
completion-eager-updateycompletion-eager-displayactualizan la UI de completion en función de la entrada incluso antes de que el usuario lo pida- Si
minibuffer-visible-completionsse configura como'up-down, se puede moverse por los candidatos visibles con las flechas - icomplete incluye el parche de bug#75784, que añade comportamiento vertical dentro del buffer y un indicador de prefijo
icomplete-vertical-in-buffer-adjust-listicomplete-vertical-render-prefix-indicator
Distribución de ventanas y Speedbar
- Emacs 31 añade comandos para cambiar la disposición de ventanas sin tener que volver a dividirlas o cerrarlas manualmente
window-layout-transposewindow-layout-rotate-clockwisewindow-layout-flip-leftrightwindow-layout-flip-topdown
transposecambia entre disposición horizontal y vertical,rotategira todo el layout, y los comandosfliplo espejan de izquierda a derecha o de arriba abajo- Son útiles cuando se quiere cambiar solo la posición de la ventana del editor en una configuración de 3 ventanas manteniendo los buffers
- En Emacs 31, Speedbar puede ubicarse en una side window en lugar de abrir un frame separado
speedbar-window-default-widthspeedbar-window-max-widthspeedbar-window
speedbar-windowacopla Speedbar al costado como si fuera un árbol de archivos moderno- En entornos tipo tiling o en laptops de una sola pantalla, este enfoque con side window encaja mejor que el frame flotante tradicional
VC y xref editable
- VC incorpora opciones que reducen fricción en el flujo cotidiano de control de versiones
vc-auto-revert-mode tvc-allow-rewriting-published-history tvc-dir-auto-hide-up-to-date 'revert
vc-dir-auto-hide-up-to-dateoculta automáticamente los archivos al día al refrescar el buffer devc-dir- Así se puede borrar el hack de teclas que antes llamaba a
vc-dir-hide-up-to-datedespués devc-dir-refresh
- Así se puede borrar el hack de teclas que antes llamaba a
vc-allow-rewriting-published-historyencaja con flujos donde se reescribe intencionalmente historial ya publicado, como en Jujutsu o force-push de feature branches- Emacs 31 incorpora un xref buffer editable
- Antes, el buffer de xref solo tenía
xref-query-replace-in-resultsenr, y estaba limitado a reemplazos basados en expresiones regulares - A diferencia de
wdired-modeen Dired ogrep-edit-modeen buffers grep, xref no tenía un flujo para editar directamente el buffer de resultados
- Antes, el buffer de xref solo tenía
- La propuesta inicial consistía en exportar resultados de xref con
xref-export-to-grepa un buffergrep-modecon formatofile:line:content, y editar desde ahí - Dmitry Gutov, mantenedor de xref, propuso en lugar de eso una edición inline del buffer xref en vez de desviar la UI hacia un buffer grep, y así nació
xref-edit-mode xref-edit-modeevita saltos a buffers extra y funciona más rápido incluso en buffers xref grandes- El flujo de uso es buscar con
C-x p g, iniciar modo de edición coneen el buffer*xref*, y luego confirmar los cambios conC-c C-c - La discusión relacionada está publicada en bug#80616
ERC y pequeñas mejoras de calidad de vida
- ERC puede insertar logs anteriores solo al abrir un target buffer nuevo con
erc-log-insert-log-on-open 'erc-log-new-target-buffer-p - En Emacs 31, el módulo
scrolltobottomde ERC ya no depende deerc-fill-wrap, así que se pueden quitar configuraciones condicionales para versiones anteriores - Otros valores pequeños también mejoran la usabilidad
delete-pair-push-mark t: después dedelete-pair, hace push del mark para poder seleccionar el interior conC-x C-xibuffer-human-readable-size t: muestra KB/MB en vez de bytes crudosielm-history-file-name: conserva el historial de entrada de IELM tras reiniciarkill-region-dwim 'emacs-word: si no hay una región activa,C-wmata la palabra siguiente en lugar de dar errornative-comp-async-on-battery-power nil: detiene la compilación nativa en segundo plano mientras se usa bateríaview-lossage-auto-refresh t:C-h lactualiza en tiempo real las teclas presionadas recientementedisplay-fill-column-indicator-warning nildired-hide-details-hide-absolute-location t: oculta la ruta absoluta del directorio endired-hide-details-modeworld-clock-sort-order "%FT%T": ajusta el ordenamiento del reloj mundialzone-all-frames tzone-all-windows-in-frame tuniquify-after-kill-buffer-flag t: el nombre cambió respecto de la variante anterior con-p
kill-region-dwimevita el error “the mark is not active” al usarC-wview-lossage-auto-refreshes útil para mostrar en tiempo real las teclas durante una clase o al compartir pantallanative-comp-async-on-battery-power nilreduce situaciones en las que el ventilador se enciende por compilación en segundo plano mientras se trabaja sin conexión eléctricatty-tip-modeofrece tooltips incluso en Emacs ejecutado con-nw
term, temas Modus y por qué usar master
- Emacs 31 corrige problemas en
termyansi-termdonde se tragaban líneas o la pantalla se corrompía- Programas como
htop,nethacko aplicaciones basadas en curses que usan direccionamiento de cursor y redraw de pantalla completa ahora se redibujan correctamente dentro del terminal de Emacs - Esto elimina una de las razones para abrir un emulador de terminal externo
- Programas como
- Emacs incluye los temas Modus 5 de Protesilaos
modus-operandi-deuteranopia: tema optimizado para deuteranopia con fondo blancomodus-operandi: tema de alta legibilidad con fondo blancomodus-operandi-tinted: tema de alta legibilidad con fondo ocre claromodus-operandi-tritanopia: tema optimizado para tritanopia con fondo blancomodus-vivendi-deuteranopia: tema optimizado para deuteranopia con fondo negromodus-vivendi: tema de alta legibilidad con fondo negromodus-vivendi-tinted: tema de alta legibilidad con fondo de cielo nocturnomodus-vivendi-tritanopia: tema optimizado para tritanopia con fondo negro
- La razón para usar a diario una versión no lanzada de Emacs es ver de primera mano qué entra al core y cómo se reduce con cada release la cantidad de glue code hecho a mano
- Como texto complementario sobre funciones que ya vienen incluidas, también se puede leer Even More Batteries Included with Emacs
1 comentarios
Comentarios en Lobste.rs
Tengo muchas ganas de ver los cambios en tree-sitter. Siempre me ha parecido que el proceso de configuración es bastante torpe
También me da curiosidad
eager complete.icompleteyfido-modese acercan bastante a lo que quiero, pero todavía no son tan cómodos de usar como paquetes de terceros comocorfuverticoy similares solo con funciones integradas, y además activadas por defectoCon unos cuantos ajustes y activando solo funciones integradas, la usabilidad cambia muchísimo;
bedrockyemacs-soloestán armados de esa formaCada vez que inicio Emacs me sale un mensaje enorme sobre un
dylibfaltanteLa sintaxis de ejemplo
(treesit-auto-install-grammar t)y(treesit-enabled-modes t)parece una llamada a función, pero en realidad son opciones que hay que configurarTambién hay pequeños cambios en la próxima versión que me gustan:
minibuffer-nonselected-modeviene activado por defecto, así es más fácil ver si quedaron tareas incompletas en el minibúfer, ydiff-modecondiff-delete-other-hunkses muy útil junto con el comportamiento de VC en buffers diff que se introdujo en Emacs 29with-work-bufferes parecido awith-temp-buffer, pero reutiliza un pool de buffers. Lo descubrí por casualidad en mi configuración personal, donde uso la misma convención de nombre de buffer*work*Emacs 31 incluye
lua-mode, así que ya no hace falta instalarlo aparteTambién tuve que hacer algunos ajustes para que volviera a funcionar exactamente como quiero:
xterm-mouse-modeviene activado por defecto, así que lo desactivé explícitamente, y la face demode-linecambia para adaptarse a temas oscuros, pero como ya estaba acostumbrado a los colores predeterminados anteriores, la revertíEmacs 31 advierte si un archivo fuente no tiene la cookie
lexical-binding. Si molesta, se puede desactivar; también se puede corregir fácilmente con el comandoelisp-enable-lexical-binding, e incluso es posible hacer delexical-bindingel valor predeterminado globalSi no aparecen bugs nuevos, como siempre, parece que será una release sólida
:customdeuse-packagePor eso me genera sensaciones encontradas
:custom. Se vuelve más incómodo al experimentar con valores o compartirloswith-work-bufferes por rendimiento? La documentación no explica por qué usarlo en lugar dewith-temp-buffer; solo dice que hay que tener más cuidadoelpa, sino solo sobre mis propios archivosAdemás, de las 68 advertencias en mi Emacs, 64 vienen de archivos generados
-autoloads.el. Eso parece algo que deberían corregir las herramientas de generación del lado deelpa/melpaPor fin estaba esperando xref editable, y esto parece que me va a facilitar mucho la vida
Hay muchos cambios excelentes que tocan sorprendentemente muchas de las cosas con las que lidio todos los días
Nvim cambió el valor predeterminado de expresiones regulares de vim a treesitter, y eso rompió mi entorno de escritura
treesitter necesitaba algo de configuración para parsear comentarios HTML dentro de Markdown, y aun después de armar todo, no funcionó
Al final lo resolví desactivando treesitter
Soy muy conservador con la infraestructura base como los editores. Los cambios en el editor casi siempre rompen algo que había funcionado sin problemas durante años