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.
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.
- Patrones potentes con “very magic” y límites de palabra.
- Delimitar la coincidencia con
\zsy\ze. - El flujo
cgn+.para reemplazar sin comandos. :substitutecon 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:
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.
Ver solució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.
¿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:
- quickfix + :cdo (lección 4.4):
:grep patróny luego:cdo s/.../.../g | update. Control total desde el teclado. - 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.
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.
Buscar-y-reemplazar en todo el proyecto con una interfaz interactiva y vista previa en vivo. El complemento visual al flujo de quickfix + :cdo.
- Usa
\vpara buscar dos palabras alternativas en un archivo. - Con
\zs, encuentra una palabra solo cuando va precedida de otra. - Renombra una variable con el flujo
*→cgn→.. - Intercambia dos columnas separadas por
=con:%s/\v(\w+)=(\w+)/\2=\1/. - Haz un reemplazo en todo el proyecto con grug-far o
:cdo.