Emacs 31 llega con markdown-ts-mode: qué cambia para quien escribe en Markdown
GNU Emacs 31.1 se publicó el 24 de agosto de 2026, según la Wikipedia de Emacs, y trae como novedad más visible un modo mayor para Markdown construido sobre tree-sitter: markdown-ts-mode. Es experimental y hay que activarlo a mano, pero ya cubre toda la especificación CommonMark, la mayor parte de GitHub Flavored Markdown (GFM) y suma extras como bloques de código coloreados con el modo nativo del lenguaje y exportación a pandoc o cmark-gfm.
El desarrollador Rahul M. Juliato, coautor del modo junto con Stéphane Marks, publicó una guía paso a paso que se ha convertido en la referencia de adopción temprana. La idea: que abrir un .md en Emacs por fin se sienta como trabajar en org-mode, sin perder la portabilidad del Markdown.
¿Qué es markdown-ts-mode y por qué importa ahora?
Un -ts-mode (tree-sitter mode) usa el parser tree-sitter para analizar el archivo como un árbol sintáctico incremental: cada pulsación se reprocesa en milisegundos y Emacs entiende la semántica del documento, no solo el texto. Eso habilita folding confiable, navegación por estructura y resaltado coherente incluso en documentos grandes.
👥 ¿Quieres ir más allá de la noticia?
En nuestra comunidad discutimos las tendencias, compartimos oportunidades y nos ayudamos entre emprendedores. Sin humo, solo acción.
👥 Unirme a la comunidadSegún el análisis de sourcefeed.dev sobre Emacs 31, hasta ahora adopter tree-sitter en Emacs implicaba pelearse con configuración manual: poblar treesit-language-source-alist, disparar treesit-install-language-grammar y rezar para que la toolchain de C cooperase. Emacs 31 introduce dos variables que automatizan ese trabajo:
treesit-auto-install-grammar: descarga y compila gramáticas faltantes sobre la marcha.treesit-enabled-modes: conmuta automáticamente al equivalente*-ts-modecuando está disponible.
Encima, las fuentes de las gramáticas más usadas (TypeScript, TSX, Rust, TOML, YAML, Dockerfile) ya vienen definidas dentro de los propios modos, según sourcefeed.dev. Eso borra varias líneas de boilerplate del init.el.
Para un founder hispanohablante, la pregunta práctica es: ¿esto cambia mi editor? Si ya editas READMEs, documentación técnica o specs en Markdown dentro de VS Code o Cursor, probablemente no. Pero si vives en Emacs o estás evaluando adoptarlo, markdown-ts-mode elimina la principal razón histórica para preferir otros editores: la edición estructurada de Markdown.
Activar markdown-ts-mode en cinco minutos
La guía oficial de Juliato propone una configuración mínima con use-package:
(use-package markdown-ts-mode
:ensure nil
:mode ("\\.md\\'" "\\.mdx\\'" "\\.markdown\\'")
:config
(require 'markdown-ts-mode-x))
La librería adicional markdown-ts-mode-x trae la tabla de contenidos, los exportadores y el resto de "extras" que el modo base delega en un paquete satélite. Si no usas use-package, el equivalente manual es cargar la librería con autoload y añadir las extensiones a auto-mode-alist.
Para probar sin tocar tu configuración, guarda el bloque en testing.el y arranca Emacs con emacs -Q --load testing.el. Eso te da una sesión limpia con el modo cargado, ideal para experimentar.
Instalar las gramáticas (el primer dolor de cabeza real)
La parte menos amable del flujo es la instalación de gramáticas. Al abrir tu primer .md, Emacs te preguntará si quieres descargar la gramática markdown (y después markdown-inline, porque Markdown necesita dos: una para el documento y otra para el formato inline). Di y y Emacs clonará el repo, lo compilará con tree-sitter-cli/gcc/make y seguirá.
Si tu cabecera tiene front-matter en YAML o TOML, el resaltado no funcionará hasta que instales también yaml y toml con M-x treesit-install-language-grammar. Lo mismo con cada bloque de código: para que python, rust, c, javascript o ruby se coloreen, hace falta su gramática. El comando C-c C-x f (force fontification) recorre el documento detectando gramáticas faltantes.
Trampa de arquitectura, documentada por sourcefeed.dev: las gramáticas se compilan como librerías compartidas (.so/.dylib) en una ruta que no se segrega por arquitectura de CPU. Si sincronizas tu ~/.emacs.d entre una máquina x86_64 y otra arm64, Emacs fallará al cargar el binario. Solución: directorio de grammars separado por host, o reconstruir en cada máquina.
Funciones que sí vas a usar el lunes
Lo que distingue a markdown-ts-mode de los resaltadores básicos:
- Folding estilo Org:
TABsobre un encabezado alterna visibilidad;S-TABcicla todos. El modo es ciudadano deoutline-minor-mode, así que el plegado funciona sin extras. - Promote/demote de headings:
M-<left>yM-<right>reescalan el nivel sin reescribir almohadillas.M-<up>yM-<down>mueven toda la sección, cuerpo incluido. - Listas y checkboxes:
M-RETcrea un nuevo item;RETcontinúa la lista actual;C-c C-calterna el checkbox. Soporta la sintaxis GFM- [x]. - Bloques de código políglotas: dentro de un bloque etiquetado
python` orust, Emacs activa el modo nativo del lenguaje. TienesTABque indenta como Python,M-qque rellena como ese modo yM-.(xref) para saltar a definiciones. Funciona también con lenguajes sin tree-sitter, comoelisp`. - Tablas: insertar con
C-c C-, t, navegar entre celdas conTAB/S-TAB, alinear conC-c C-c. Hay limitaciones conocidas, sobre todo porque la gramática GFM de tablas tiene bordes rugosos. - Exportación:
M-x markdown-ts-convertlanza el convertidor que elijas (pandoc para PDF/HTML, cmark-gfm para GitHub). Con prefijo, muestra el resultado enewwcomo preview. - Tabla de contenidos: delimitada por comentarios HTML
<!-- markdown-ts-toc: -->, se regenera conM-x markdown-ts-toc-generateo automáticamente al guardar activandomarkdown-ts-toc-update-before-save-mode.
Hay además un modo de solo lectura, markdown-ts-view-mode, con teclas de una sola letra (n, p, u, f, b) pensado para leer READMEs sin miedo a escribir encima.
El truco de los bloques de código: lo mejor y lo peor
El resaltado nativo del bloque de código es la función estrella. Un README con ejemplos en Python, TypeScript y Rust se ve con el coloreado real de cada lenguaje, no con un fondo plano. Juliato subraya que también funciona con lenguajes no tree-sitter, incluido elisp, lo que abre la puerta a escribir tutoriales dentro del propio Emacs con resaltado decente.
La cara B: completar código dentro del bloque sigue siendo un "rough spot" por la complejidad de encadenar dos parsers. Si dependes de LSP con eglot para autocompletar, prepárate para reportar bugs. El propio Juliato pide que los errores se reporten con M-x report-emacs-bug y un ejemplo mínimo reproducible, porque parte del comportamiento viene de la gramática upstream (tree-sitter-grammars/tree-sitter-markdown), no del código de Emacs.
Qué significa esto para tu startup
Si tu equipo escribe documentación técnica, READMEs extensos o specs de producto en Markdown, la llegada de markdown-ts-mode reduce una de las fricciones históricas de estandarizar Emacs como editor del equipo: editar documentos largos sin perder estructura.
Acciones concretas esta semana:
- Prueba markdown-ts-mode en una sesión limpia (
emacs -Q --load testing.el) antes de adoptarlo en tuinit.el. Verás rápido si tu flujo de trabajo depende de algún paquete incompatible. - Audita qué gramáticas necesitas realmente. Lista los lenguajes que aparecen en tus docs (Python, TS, YAML, Bash) y preinstala solo esas. Evita compilar "por si acaso": cada gramática ocupa tiempo de build.
- Aprovecha la exportación a pandoc. Si hoy usas un pipeline aparte para convertir Markdown a PDF o HTML para clientes/inversores,
M-x markdown-ts-convertconpandocte deja hacerlo desde el editor y previsualizar eneww. - Separa el directorio de grammars por arquitectura si tu equipo sincroniza
~/.emacs.dentre Macs ARM e Intel, o entre servidores x86 y laptops ARM. Es un fix de cinco minutos que evita un lunes de debugging.
Limitaciones que debes conocer antes de adoptarlo
- Es experimental. La propia Emacs lo etiqueta así: puede haber regresiones entre versiones menores.
- Buffers indirectos no funcionan con tree-sitter. Si usas paquetes que clonan regiones en buffers indirectos, no habrá resaltado ahí. Es una limitación del propio Emacs con tree-sitter, no específica de Markdown.
- Las gramáticas no son propiedad de Emacs. La gramática
tree-sitter-markdownla consumen Helix, Neovim y otros editores. Un fix que necesitas puede tardar en llegar porque hay que consensuarlo entre todos los usuarios. - Construir gramáticas puede requerir Node.js. Algunas se generan desde una definición en JavaScript y necesitan
tree-sitterCLI y Node en el sistema, además degccymake.
Fuentes
- Emacs 31: An unofficial guide to markdown-ts-mode (fuente original)
- Emacs 31 Refines Tree-Sitter and Introduces Native Markdown — sourcefeed.dev
- Emacs — Wikipedia
👥 ¿Quieres ir más allá de la noticia?
En nuestra comunidad discutimos las tendencias, compartimos oportunidades y nos ayudamos entre emprendedores. Sin humo, solo acción.
👥 Unirme a la comunidad












