wandres.dev
MAESTRO · Dominio profundo del editor

Búsqueda y reemplazo avanzado

Very magic, capturas, \zs/\ze, el truco de cgn y reemplazo en todo el proyecto. Deja de hacer cambios a mano: descríbelos con patrones y aplícalos en bloque.

⏱ 16 min

Buscar y reemplazar es donde Neovim se siente como magia. Con patrones bien hechos transformas texto que a mano llevaría diez minutos en una sola línea de comando. Y el truco de cgn es de los que cambian tu forma de editar para siempre.

🎯 Al terminar esta lección sabrás
  • Patrones potentes con “very magic” y límites de palabra.
  • Delimitar la coincidencia con \zs y \ze.
  • El flujo cgn + . para reemplazar sin comandos.
  • :substitute con capturas, confirmación y expresiones.
  • Reemplazo en todo el proyecto.

Buscar con patrones que no duelen

La sintaxis de regex de Vim es peculiar. El atajo es “very magic” (\v): hace que la regex se parezca a las de otros lenguajes, sin escapar tanto.

Patrón Significado
/\vfoo|bar very magic: (, ), |, + funcionan sin escape
/\<palabra\> límites de palabra (coincide “palabra” entera)
/foo\c ignora mayúsculas solo en esta búsqueda (\C las respeta)
* / # busca la palabra bajo el cursor (adelante / atrás)

\zs y \ze: coincide, pero selecciona menos

\zs marca dónde empieza la coincidencia real y \ze dónde termina, aunque el patrón exija contexto alrededor:

/foo\zsbar        → encuentra 'bar' solo si va tras 'foo' (pero selecciona 'bar')
/\vitem\ze:       → encuentra 'item' solo si va seguido de ':' (sin incluir ':')

Es la forma de decir “busca X en tal contexto, pero actúa solo sobre X”.

El truco estrella: cgn + .

gn selecciona la siguiente coincidencia de tu última búsqueda. Combinado con un operador, es oro:

cgn: reemplazo interactivo sin comandos

Busca una palabra con * (o /palabra). Ahora pulsa cgn, escribe el reemplazo y Esc. Acabas de cambiar la primera aparición. Ve a la siguiente y pulsa . — repite el cambio. n para saltar una sin tocarla. Es buscar-y-reemplazar con revisión, sin escribir un solo :s, controlando cada ocurrencia con una tecla. Muchos expertos reemplazan así el 90% del tiempo.

⛳ DRILL Renombra 'total' por 'suma' en un archivo, revisando cada aparición.
Ver solución
* cgn suma Esc . n .

* busca la palabra bajo el cursor. cgn cambia la siguiente coincidencia (escribe suma, Esc). En la siguiente: . la repite, o n la salta. Avanzas ocurrencia a ocurrencia decidiendo cuál cambiar.

:substitute con todo su poder

La forma general es :{rango}s/patrón/reemplazo/{flags}.

Elemento Ejemplo
Rango: archivo entero :%s/a/b/g
Rango: selección visual :'<,'>s/a/b/g
Flag confirmación :%s/a/b/gc (pregunta en cada una)
Flag ignore-case :%s/a/b/gi
Capturas :%s/\v(\w+)=(\w+)/\2=\1/ (intercambia)
Toda la coincidencia :%s/error/[&]/g (envuelve en corchetes)
Cambiar caja :%s/\v<(\w)/\u\1/g (pone mayúscula inicial)

Los grupos \1, \2… reutilizan lo capturado con paréntesis. & es la coincidencia completa. \u / \l cambian a mayúscula/minúscula la siguiente letra; \U / \L hasta un \E.

💡
La /gc es tu amiga

¿No te fías del patrón? Añade el flag c: Neovim se detiene en cada coincidencia y te pregunta (y=sí, n=no, a=todas, q=parar). Reemplazo masivo con confirmación, línea a línea, sin riesgo.

Reemplazo en todo el proyecto

Dos caminos, según prefieras terminal o interfaz:

  1. quickfix + :cdo (lección 4.4): :grep patrón y luego :cdo s/.../.../g | update. Control total desde el teclado.
  2. grug-far.nvim: una interfaz dedicada de buscar-y-reemplazar en el proyecto. Abre un buffer normal donde escribes el patrón y el reemplazo, y vas viendo el diff de todas las coincidencias antes de aplicar nada.
MagicDuck/grug-far.nvim
return {
  "MagicDuck/grug-far.nvim",
  cmd = { "GrugFar", "GrugFarWithin" },
  keys = {
    { "<leader>sr", function() require("grug-far").open() end, desc = "Buscar y reemplazar (proyecto)" },
  },
  opts = {},
}
vim.pack.add({ { src = "https://github.com/MagicDuck/grug-far.nvim" } })

require("grug-far").setup({})

vim.keymap.set("n", "<leader>sr", function()
  require("grug-far").open()
end, { desc = "Buscar y reemplazar (proyecto)" })

Usa ripgrep por debajo, así que necesitas rg instalado. El propio plugin ya difiere sus requires: con vim.pack tampoco te cuesta arranque, solo se despierta cuando abres la ventana.

Dentro del buffer, las acciones (reemplazar, sincronizar líneas, mandar a la quickfix) cuelgan de <localleader>: si no lo tienes definido, defínelo antes de usarlo. Y :GrugFarWithin limita la búsqueda al rango de la selección visual.

🔁
grug-far.nvimMagicDuck/grug-far.nvim

Buscar-y-reemplazar en todo el proyecto con una interfaz interactiva y vista previa en vivo. El complemento visual al flujo de quickfix + :cdo.

opt
⚔️ Transforma texto como un mago
  1. Usa \v para buscar dos palabras alternativas en un archivo.
  2. Con \zs, encuentra una palabra solo cuando va precedida de otra.
  3. Renombra una variable con el flujo *cgn..
  4. Intercambia dos columnas separadas por = con :%s/\v(\w+)=(\w+)/\2=\1/.
  5. Haz un reemplazo en todo el proyecto con grug-far o :cdo.