A veces utilizo :s
con una expresión regular complicada que puede ser correcta o no, o no seguro si quiero reemplazar todas coincidencias.
¿Hay alguna manera de decirle a Vim que confirme todas las coincidencias que encuentre antes de que realmente reemplace el texto?
Responder
¡Sí! Utilice la marca c
para :substitute
. De :help substitute
:
[c] Confirm each substitution. Vim highlights the matching string (with hl-IncSearch). You can type: :s_c "y" to substitute this match "l" to substitute this match and then quit ("last") "n" to skip this match <Esc> to quit substituting "a" to substitute this and all remaining matches {not in Vi} "q" to quit substituting {not in Vi} CTRL-E to scroll the screen up {not in Vi, not available when compiled without the +insert_expand feature} CTRL-Y to scroll the screen down {not in Vi, not available when compiled without the +insert_expand feature}
El ejemplo de uso es muy simple:
%s/old/new/gc
Esto es muy útil, pero no lo sabía hasta hace 2 semanas 🙂 E incluso está disponible en el antiguo vi 🙂
Consejo adicional: es posible que también desee utilizar :set nowrapscan
; esto evita que Vim se enrolle hacia arriba cuando toca el fondo. He encontrado que esto es especialmente útil cuando utilizo la bandera c
.
Comentarios
- También agregaría que si desea reemplazar todas las instancias de
old
en la misma línea (no solo la primera aparición), debe agregarg
al final del comando, por lo que en total tendrá%s/old/new/gc
- Oh, sí; tengo
set gdefault
así que tiendo a olvidar agregarlo en los ejemplos @ e271p314 😅
Responder
Además de lo que dijo Carpetsmoker:
La configuración &incsearch
(set incsearch
) en Vim es realmente útil. Puede úselo junto con un truco útil y poco conocido.
El truco consiste en probar su expresión regular compleja simplemente usando /
o ?
comando. Vim utilizará la configuración &incsearch
para mostrar las coincidencias de forma interactiva. Onc Si está satisfecho con la expresión regular, puede usar :%s//replacement
para que vim use la búsqueda anterior.
Observe cómo la parte en //
está en blanco (ahí es donde pones el texto para buscar). Si lo deja en blanco, le está diciendo a Vim que use la expresión regular de búsqueda anterior. Con esto, puede escribir una expresión regular compleja con /
y tener todos los beneficios de set incsearch
, y luego usar el %s//replacement
comando para ejecutar la búsqueda y reemplazar.
Si desea algo similar a incsearch para :s
comandos, consulte vim-over , pero prefiero usar la forma nativa de Vim.
Comentarios
Responder
Mi sustitución interactiva favorita es buscar usando / y revisar las coincidencias usando n .
Luego seleccione coincidir usando g n y luego s para sustituir el texto con lo que quiera .
Y repita moviéndose a la siguiente coincidencia y presionando .
Comentarios
- Este es un truco muy bueno, porque es: (1) interactivo, (2) puede ir a la coincidencia anterior si se saltó accidentalmente (algo que no puede hacer con
:s/old/new/gc
).
Responder
opción que le permite obtener una vista previa del resultado del comando :s
mientras lo escribe.
Respuesta
Para el beneficio de todos, incsearch
se actualizó en vim8 para mostrar también la vista previa a medida que escribe el patrón.
:%s/pattern/replace/
y luego presioneu
para deshacer, puede ver las partes que Vim cambió si tienehlsearch
habilitado. Y puede reemplazar este texto nuevamente con^R
.