Neovim introduce una API async estructurada para Lua
La nueva capa vim.async permite ejecutar código Lua sin bloquear el bucle de eventos, con tareas, semáforos y control de cancelación.

Neovim ha añadido a su documentación oficial una API asíncrona para Lua, accesible a través del módulo vim.async. La finalidad es permitir que scripts Lua esperen timers, callbacks y otras operaciones sin detener el bucle de eventos del editor.
La ejecución asíncrona se basa en tasks. Un task se crea con vim.async.run() y puede pausarse en cualquier punto mediante vim.async.await() o su variante vim.async.pawait(), que captura errores al estilo pcall. Los tasks pueden crear subtareas; estas se añaden al árbol de concurrencia y solo se ejecutan cuando el padre alcanza el siguiente checkpoint. El control de la jerarquía permite que, si una sub‑tarea falla sin ser manejada, el task padre también falle y cierre sus demás hijos.
Para trabajos que deben seguir ejecutándose después de que el task original termine, está disponible Task:detach(). Un task desvinculado pasa a ser de nivel superior y ya no es supervisado por su creador. La propiedad Task:close() marca un task como en proceso de cierre; la cancelación se lleva a cabo de forma cooperativa en el siguiente checkpoint.
Además de la gestión de tareas, la API incluye utilidades de sincronización como vim.async.semaphore(). Un semáforo limita la cantidad de tareas concurrentes que pueden acceder a un recurso. La forma recomendada de usarlo es mediante el método with(), que adquiere y libera automáticamente el permiso alrededor de una función.
Ejemplo básico de uso:
local async = vim.async
async.run(function()
async.notify('esperando...')
async.sleep(1000)
async.notify('listo')
end)
En este fragmento se lanza un task que muestra una notificación, duerme un segundo y vuelve a notificar, todo sin bloquear la UI.
Otro caso muestra cómo manejar una llamada estilo callback que devuelve err, result:
async.run(function()
local err, stat = async.await(2, fs_stat, 'notes.txt')
if err then error(err, 0) end
print(('notes.txt tiene %d bytes'):format(stat.size))
end)
La documentación también describe cómo observar la finalización de un task desde código síncrono usando Task:wait() o Task:pwait(), y cómo registrar callbacks con Task:on_complete().
En conjunto, la nueva capa async aporta a los plugin developers de Neovim una forma estructurada y segura de ejecutar código concurrente, reduciendo la necesidad de trucos con vim.schedule() o timers manuales.
Esta funcionalidad abre la puerta a plugins más responsivos y a pipelines de edición que pueden lanzar procesos externos, lecturas de archivo o consultas HTTP sin bloquear la experiencia del usuario. La comunidad todavía está explorando los patrones de uso óptimos, pero la presencia de semáforos y manejo de errores sugiere que la API está preparada para escenarios de producción.