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
olden la misma línea (no solo la primera aparición), debe agregargal final del comando, por lo que en total tendrá%s/old/new/gc - Oh, sí; tengo
set gdefaultasí 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 presioneupara deshacer, puede ver las partes que Vim cambió si tienehlsearchhabilitado. Y puede reemplazar este texto nuevamente con^R.