vim.async es el módulo de Neovim que ofrece una API asíncrona estructurada para código Lua que necesita esperar a operaciones del event loop sin bloquear el editor. Permite suspender tareas en puntos de control y gestionar tareas hijas creadas mientras otra está en ejecución, manteniendo la planificación de forma cooperativa: solo se cede el control al event loop cuando una tarea espera un temporizador, una operación de E/S, una devolución de llamada u otra tarea; el código Lua síncrono nunca se interrumpe a mitad de un frame.
El flujo básico se inicia con vim.async.run(), que crea una tarea. Dentro de ella se usan vim.async.await() para esperar APIs basadas en callbacks u otras tareas, y vim.async.pawait() cuando la operación puede fallar y la tarea actual debe continuar. Las tareas cumplen dos funciones: son un manejador que se puede esperar o cerrar, y un ámbito para las tareas hijas. Una tarea de nivel superior arranca de inmediato, mientras que una tarea creada dentro de otra se convierte en hija y comienza cuando el padre alcanza su siguiente punto de control. El padre solo termina después de que sus hijas adjuntas finalizan; si una hija falla sin gestionarse, el padre falla y cierra al resto.
Para trabajos en segundo plano que deban sobrevivir a la tarea actual existe Task:detach(), que convierte la tarea en trabajo de nivel superior. El cierre es cooperativo: Task:close() marca la tarea como en cierre y la cancelación se observa en el siguiente punto de control. Como utilidades de coordinación, vim.async.iter() entrega manejadores en orden de finalización, vim.async.timeout() aplica un plazo de espera y vim.async.semaphore() limita cuántas tareas pueden mantener un permiso simultáneamente, útil para acotar lecturas de archivos, peticiones o subprocesos.
