Emacs 31 estrena markdown-ts-mode: guía práctica y por qué importa

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 comunidad

Segú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-mode cuando 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: TAB sobre un encabezado alterna visibilidad; S-TAB cicla todos. El modo es ciudadano de outline-minor-mode, así que el plegado funciona sin extras.
  • Promote/demote de headings: M-<left> y M-<right> reescalan el nivel sin reescribir almohadillas. M-<up> y M-<down> mueven toda la sección, cuerpo incluido.
  • Listas y checkboxes: M-RET crea un nuevo item; RET continúa la lista actual; C-c C-c alterna 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 con TAB/S-TAB, alinear con C-c C-c. Hay limitaciones conocidas, sobre todo porque la gramática GFM de tablas tiene bordes rugosos.
  • Exportación: M-x markdown-ts-convert lanza el convertidor que elijas (pandoc para PDF/HTML, cmark-gfm para GitHub). Con prefijo, muestra el resultado en eww como preview.
  • Tabla de contenidos: delimitada por comentarios HTML <!-- markdown-ts-toc: -->, se regenera con M-x markdown-ts-toc-generate o automáticamente al guardar activando markdown-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:

  1. Prueba markdown-ts-mode en una sesión limpia (emacs -Q --load testing.el) antes de adoptarlo en tu init.el. Verás rápido si tu flujo de trabajo depende de algún paquete incompatible.
  2. 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.
  3. 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-convert con pandoc te deja hacerlo desde el editor y previsualizar en eww.
  4. Separa el directorio de grammars por arquitectura si tu equipo sincroniza ~/.emacs.d entre 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-markdown la 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-sitter CLI y Node en el sistema, además de gcc y make.

Fuentes

👥 ¿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

Daily Shot: Tu ventaja táctica

Lo que pasó en las últimas 24 horas, resumido para que tú no tengas que filtrarlo.

Suscríbete para recibir cada mañana la curaduría definitiva del ecosistema startup e inversionista. Sin ruido ni rodeos, solo la información estratégica que necesitas para avanzar:

  • Venture Capital & Inversiones: Rondas, fondos y movimientos de capital.
  • IA & Tecnología: Tendencias, Web3 y herramientas de automatización.
  • Modelos de Negocio: Actualidad en SaaS, Fintech y Cripto.
  • Propósito: Erradicar el estancamiento informativo dándote claridad desde tu primer café.

📡 El Daily Shot Startupero

Noticias del ecosistema startup en 2 minutos. Gratis, todos los días.

Share to...