wandres.dev
LA API · vim.api, vim.fn, vim.opt

Leer la documentacion: help como fuente de verdad

La ayuda de Neovim no es un manual de consulta ocasional sino la especificación normativa del editor, escrita por quienes escriben el código y versionada junto a él. Se lee como una especificación, no como un tutorial.

⏱ 20 min

Hay una diferencia de método, no de talento, entre quien resuelve un problema de Neovim en dos minutos y quien pasa la tarde probando fragmentos copiados de foros. La persona rápida no ha memorizado más: sabe que la respuesta está en :help, sabe construir la etiqueta exacta que lleva hasta ella y sabe interpretar lo que lee como lo que es, una especificación normativa y no una guía amable. La documentación de Neovim vive en el mismo repositorio que el código, la escriben quienes implementan los cambios y se versiona con ellos. Es la única fuente que no envejece por su cuenta, y aprender a navegarla es probablemente la habilidad de mayor rendimiento de todo este nivel.

🎯 Al terminar esta lección sabrás
  • Construir la etiqueta de ayuda correcta para opciones, funciones, comandos y teclas.
  • Distinguir el manual de usuario de los archivos de referencia y saber cuándo acudir a cada uno.
  • Buscar en la documentación sin conocer el nombre exacto de lo que se busca.
  • Diagnosticar comportamientos inesperados con :checkhealth, :verbose y :messages.

La documentacion como contrato

La ayuda no describe lo que el editor suele hacer: describe lo que se compromete a hacer. Esa distinción tiene consecuencias prácticas. Cuando la entrada de una función de la API dice que los índices empiezan en cero y que el final del rango es exclusivo, eso no es una observación sobre la implementación actual sino una garantía que sobrevivirá a las próximas versiones. Cuando dice que una opción es de buffer, ese ámbito es parte del contrato. Y cuando una función está marcada como obsoleta, la marca incluye desde qué versión lo está y qué la sustituye.

Experimentar en el editor te dice lo que ocurre hoy en tu máquina. La documentación te dice además lo que seguirá ocurriendo, y esa es la diferencia entre una configuración que aguanta tres actualizaciones y una que se rompe con la primera.

Hay un segundo motivo, menos obvio, para preferirla a la experimentación: la ayuda documenta también los casos que no puedes provocar fácilmente. Qué ocurre si el manejador de buffer ya no es válido, qué pasa cuando el rango excede el número de líneas, cómo se comporta la función si el archivo no existe. Reproducir cada uno de esos casos a mano cuesta más que leer el párrafo que los describe, y omitirlos es exactamente lo que convierte una configuración en frágil.

Conviene conocer el mapa antes de moverse por él. El archivo de la biblioteca de Lua contiene la guía de introducción y el catálogo de módulos. El de la API documenta cada función nvim_ con sus parámetros y sus errores. El de opciones tiene una entrada por opción, con su ámbito y su valor por defecto. El de funciones incorporadas cubre todo lo accesible desde vim.fn. Los archivos del manual de usuario, con nombres que empiezan por las siglas correspondientes, son pedagógicos y se leen en orden; los de referencia son normativos y se consultan. Y hay tres que casi nadie abre y deberían ser rutina: el de novedades de cada versión, el de elementos obsoletos y el de diferencias respecto de Vim, indispensable este último cuando adaptas una respuesta encontrada en internet que fue escrita para el editor original.

La gramatica de las etiquetas

Todo lo documentado tiene una etiqueta, y las etiquetas siguen una gramática que puedes aplicar sin buscar. Dominarla convierte el nombre de cualquier cosa en su dirección exacta.

Las opciones se escriben entre comillas simples. Las funciones llevan sus paréntesis vacíos. Los comandos ex llevan el carácter de dos puntos delante. Las funciones de la API se nombran con su identificador completo. Las teclas de modos distintos del normal llevan un prefijo de una letra y un guion bajo, y las de secuencia también se escriben con su prefijo.

:help 'scrolloff'          " opcion, entre comillas simples
:help getline()            " funcion de Vimscript
:help nvim_buf_set_lines() " funcion de la API
:help :bufdo               " comando ex
:help i_CTRL-W             " CTRL-W en modo Insercion
:help v_u                  " la tecla u en modo Visual
:help c_CTRL-R             " CTRL-R en la linea de comandos
:help g_CTRL-A             " secuencia que empieza por g
:help vim.opt              " modulo de la biblioteca de Lua

La consecuencia práctica es que casi nunca hace falta buscar: si sabes cómo se llama algo, sabes dónde está documentado. Y si dudas de la etiqueta exacta, la línea de comandos completa con la tecla de tabulación y lista todas las candidatas con la combinación de listado.

Dentro de la ayuda, la navegación es la de un hipertexto. La combinación de corchete de cierre con la tecla de control salta a la etiqueta bajo el cursor; la de la letra te devuelve por donde viniste; el mismo mecanismo de la pila de etiquetas que usas para saltar a definiciones en tu código funciona idéntico aquí, porque es literalmente el mismo mecanismo.

💡
Los ejemplos de la ayuda son ejecutables

Los bloques de código de la documentación se pueden evaluar sin salir de ella. Coloca el cursor en una línea de Lua dentro de un archivo de ayuda y ejecútala con el comando de evaluación de línea. Es la forma más rápida de comprobar si has entendido bien una firma antes de llevarla a tu configuración.

Buscar cuando no sabes el nombre

El caso difícil es el otro: sabes qué quieres conseguir pero no cómo se llama. Para eso hay tres instrumentos, en orden creciente de fuerza bruta.

El primero es el completado de la propia ayuda, que acepta comodines. Escribir un fragmento con un asterisco delante y detrás lista todas las etiquetas que lo contienen, y muy a menudo el nombre aparece ahí a la primera.

El segundo es la búsqueda global en toda la documentación, que recorre cada archivo y deposita las coincidencias en la lista de correcciones rápidas. Es el instrumento adecuado cuando buscas un concepto y no un identificador, y encaja con todo el flujo de trabajo de esa lista que ya conoces.

El tercero es preguntar al editor en lugar de a la documentación, que es el tema de la lección siguiente y que aquí aparece solo como anticipo: el motor de completado de la línea de comandos puede consultarse desde Lua, de modo que obtener la lista de todas las opciones o de todos los eventos que contienen una cadena es una llamada de una línea.

:help *fold*        " comodines en la etiqueta
:helpgrep marca de columna
:copen              " las coincidencias, en la lista de correcciones

Merece la pena añadir un hábito que casi nadie adopta y que multiplica el rendimiento de la ayuda: leer la entrada entera, no la primera línea. Las entradas de opciones incluyen su ámbito, su valor por defecto, sus interacciones con otras opciones y, con frecuencia, una advertencia sobre el caso límite que estás a punto de encontrarte. Las entradas de funciones de la API terminan casi siempre con una sección de parámetros y otra de valores devueltos que resuelven de golpe la duda que te llevó allí. Buscar la línea exacta y salir corriendo desperdicia el ochenta por ciento del texto útil.

🔌

La etiqueta es la direccion

Si sabes cómo se llama, sabes dónde está. La gramática de comillas, paréntesis, dos puntos y prefijos de modo convierte cualquier nombre en una consulta directa.

🧭

Referencia y manual no son lo mismo

Los archivos de usuario enseñan y se leen en orden; los de referencia certifican y se consultan. Acudir al equivocado es la causa habitual de no encontrar lo que sí estaba escrito.

Diagnosticar: checkhealth, verbose y messages

Cuando algo no funciona, la secuencia eficiente tiene un orden y saltárselo cuesta tiempo.

Primero, :checkhealth. El sistema de salud recolecta comprobaciones declaradas por el propio Neovim y por cada plugin instalado, y las ejecuta produciendo un informe con tres niveles de severidad y, lo más valioso, con instrucciones concretas de remedio. Se puede acotar a un componente para no leer el informe entero. Escribir el tuyo propio es trivial: un módulo con nombre de salud dentro de tu plugin que use las funciones de inicio, éxito, aviso y error del módulo correspondiente.

-- lua/mi/health.lua
local M = {}

function M.check()
  vim.health.start("mi configuracion")
  if vim.fn.executable("rg") == 1 then
    vim.health.ok("ripgrep encontrado")
  else
    vim.health.error("falta ripgrep", { "instalalo con tu gestor de paquetes" })
  end
end

return M

Segundo, :messages. Un error que se imprimió durante el arranque y desapareció bajo la pantalla de inicio sigue estando ahí. Es sorprendente la cantidad de problemas que se diagnostican en el primer minuto simplemente leyendo lo que el editor ya había dicho. Cuando el fallo solo aparece al arrancar, el argumento de línea de órdenes que registra la traza de carga produce un archivo con todo lo que se ejecutó y en qué orden, que es la única forma fiable de saber quién llegó antes en una carrera entre plugins.

Tercero, y es el instrumento más infravalorado de los tres, el prefijo de verbosidad. Anteponerlo a una consulta de opción o de mapeo hace que Neovim indique el archivo y la línea exactos donde se estableció ese valor. Ante la pregunta de quién ha cambiado esta opción, o qué plugin ha secuestrado esta tecla, es la respuesta directa en lugar de una búsqueda a ciegas por el directorio de configuración.

:verbose set shiftwidth?
:verbose nmap <leader>f
:verbose autocmd BufWritePre
flowchart TB
X[Algo no funciona] --> H[checkhealth del componente]
H --> M[messages para errores ya impresos]
M --> V[verbose set o verbose map]
V --> D[help de la etiqueta exacta]
D --> N[news y deprecated de tu version]
N --> F[Correccion con contrato conocido]
style H fill:#f9e2af,color:#11111b
style F fill:#a6e3a1,color:#11111b
La ayuda no es un manual, es el codigo fuente en prosa

Hay un cambio de actitud que separa a quien consulta la ayuda de quien la habita, y no tiene que ver con la velocidad de lectura sino con entender qué clase de texto es. Los archivos de la documentación de Neovim viven en el mismo repositorio que el código, se modifican en las mismas confirmaciones que cambian el comportamiento y se revisan con el mismo rigor. Cuando la entrada de una función dice que puede lanzar un error si el manejador no es válido, esa frase no la escribió un redactor técnico interpretando el código: la escribió quien implementó la comprobación, en el mismo momento en que la implementó. Por eso la ayuda contiene una categoría de información que ningún tutorial, ningún foro y ningún modelo de lenguaje pueden ofrecer con la misma autoridad: no solo lo que ocurre, sino lo que está garantizado que siga ocurriendo. Y de ahí se deduce la disciplina que conviene adoptar para el resto de tu vida con este editor. Cuando encuentres un fragmento de configuración en internet, no lo pegues: extrae de él los nombres, búscalos en la ayuda y lee sus dos o tres párrafos. Descubrirás con frecuencia que el fragmento hacía algo ligeramente distinto de lo que decía su título, que estaba escrito para el editor original y no para este, o que la función que usaba lleva dos versiones marcada como obsoleta con un reemplazo mejor documentado en la línea siguiente. Ese pequeño rodeo de treinta segundos es lo que convierte una configuración copiada en una configuración comprendida, y comprendida significa exactamente una cosa: que sabrás repararla tú cuando se rompa.

⚔️ Convierte la ayuda en tu primer reflejo
  1. Construye de memoria la etiqueta de ayuda de una opción, una función de Vimscript, una función de la API, un comando ex y una tecla de modo Inserción. Verifica las cinco.
  2. Elige tres líneas de tu configuración que copiaste sin entender. Localiza la entrada de ayuda de cada nombre implicado y resume en una frase qué garantiza.
  3. Ejecuta :checkhealth completo y arregla todo lo que aparezca en rojo. Anota cuántos de esos problemas desconocías.
  4. Usa el prefijo de verbosidad para averiguar qué archivo estableció tu valor actual de una opción y qué plugin definió un mapeo que creías tuyo.
  5. Escribe un módulo de salud para tu propia configuración que verifique las dependencias externas que necesitas y compruébalo desde :checkhealth.