wandres.dev
DIOS · Terminal · IA · Automatización

Automatización: macros, registros y :g

Las herramientas de poder que automatizan lo repetitivo: macros, registros, marcas, la lista quickfix, comandos globales :g y :normal, y user commands propios.

⏱ 20 min

Aquí es donde Neovim deja atrás a cualquier editor. Cuando una tarea se repite, no la haces N veces: la grabas una vez y la aplicas a todo. Macros, registros y comandos globales convierten trabajo de minutos en pulsaciones.

🎯 Al terminar esta lección sabrás
  • Grabar y reproducir macros para tareas repetitivas.
  • Usar registros y marcas como memoria de trabajo.
  • Editar en masa con :g y :normal.
  • La lista quickfix para operar sobre muchos archivos.
  • Crear tus propios comandos y autocmds.

Macros: graba una vez, repite mil

Una macro graba una secuencia de teclas y la reproduce. Es la automatización más directa de Neovim.

qa empieza a grabar en el registro aq para de grabar@a reproduce la macro a@@ repite la última macro10@a reprodúcela 10 veces

El flujo de oro: haz la edición de una línea usando movimientos que funcionen en cualquier línea (empieza con 0 o ^, termina bajando con j). Luego aplícala a las demás.

Ejemplo: envolver cada línea en comillas y añadir coma.
qa          → graba en 'a'
I"          → inserta " al inicio
<Esc>A",    → añade ", al final
j           → baja a la siguiente línea
q           → para
99@a        → aplica a las 99 líneas restantes
💡
Edita una macro como texto

Una macro es solo texto en un registro. Si te equivocaste, pégala con "ap, corrige las teclas a mano y vuelve a cargarla con "ayy (copiando la línea al registro a). Las macros no son mágicas: son teclas guardadas.

Registros: portapapeles múltiple

Neovim tiene decenas de “portapapeles” llamados registros. Antepón "x a un yank/delete/paste para usar el registro x:

Registro Contenido
"a"z los que tú asignas ("ayy copia al registro a)
"0 el último yank (no lo pisan los delete)
"+ el portapapeles del sistema
"% el nombre del archivo actual
": el último comando ejecutado

Míralos todos con :registers. El registro "0 es un salvavidas: tras borrar algo, tu último yank sigue intacto ahí.

Marcas: teletransporte

Las marcas guardan posiciones. m{letra} pone una marca; el backtick seguido de la letra (por ejemplo, backtick + a) salta a ella exacta.

ma marca la posición como ‘a’backtick + a salta a ‘a’dos backticks vuelve a donde estabas antes del saltolas MAYÚSCULAS (mA) cruzan archivos

:g — el comando global (nivel dios puro)

:g/patrón/comando ejecuta un comando Ex en cada línea que coincide. Es edición en masa condicional:

:g/TODO/d            " borra todas las líneas con TODO
:g/^$/d              " borra todas las líneas vacías
:g/foo/normal A;     " añade ; al final de cada línea con foo
:g/error/t$          " copia al final del archivo cada línea con error
:v/importante/d      " borra las líneas que NO tienen 'importante'

:normal (o :norm) ejecuta comandos de modo Normal desde la línea de comandos, y combinado con :g aplica ediciones complejas a muchas líneas de golpe.

La combinación definitiva

:g/patrón/normal @a reproduce una macro en cada línea que coincide con un patrón. Macros + comando global es, literalmente, programar tu editor en tiempo real: describes un patrón y una transformación, y Neovim la aplica a todo el archivo en un instante. Pocas herramientas igualan este poder de edición.

Quickfix: operar sobre muchos archivos

La lista quickfix junta ubicaciones (resultados de grep, errores de compilación) para navegarlas y editarlas en masa.

:grep función src/       " llena la quickfix con las coincidencias
:copen                   " abre la lista
:cdo s/viejo/nuevo/g | update   " ejecuta un cambio en CADA entrada

:cdo corre un comando sobre cada entrada de la quickfix: es la forma de hacer un buscar-y-reemplazar en todo el proyecto con control total. Desde el picker de snacks (<leader>fg) puedes mandar resultados a la quickfix y operar sobre ellos.

Tus propios comandos y autocmds

Automatiza tu flujo con comandos a medida:

-- Comando :Reload para recargar la config sin reiniciar
vim.api.nvim_create_user_command("Reload", function()
  for name, _ in pairs(package.loaded) do
    if name:match("^config") or name:match("^plugins") then
      package.loaded[name] = nil
    end
  end
  dofile(vim.env.MYVIMRC)
  vim.notify("Config recargada")
end, {})

-- Al abrir un archivo, vuelve a la última posición donde estabas
vim.api.nvim_create_autocmd("BufReadPost", {
  callback = function()
    local mark = vim.api.nvim_buf_get_mark(0, '"')
    if mark[1] > 0 and mark[1] <= vim.api.nvim_buf_line_count(0) then
      pcall(vim.api.nvim_win_set_cursor, 0, mark)
    end
  end,
})
💡
Profundiza en el Nivel 4

Esto es la automatización del día a día. Para llevarlo al límite, el Nivel 4 (Maestro) dedica lecciones enteras a Registros y marcas a nivel experto y a Quickfix y location list a fondo.

⚔️ Automatiza de verdad
  1. Graba una macro que transforme una línea y aplícala con 99@a.
  2. Usa :g/^$/d para borrar líneas vacías de un archivo.
  3. Copia algo, borra otra cosa, y recupera tu copia con "0p.
  4. Haz un reemplazo global con :grep + :copen + :cdo.
  5. Combina macro + global: :g/patrón/normal @a.