¿Puedo hacer una sustitución interactiva (buscar & reemplazar)?

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 agregar g 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

  • Solía usar una variante de esto: solo use :%s/pattern/replace/ y luego presione u para deshacer, puede ver las partes que Vim cambió si tiene hlsearch habilitado. Y puede reemplazar este texto nuevamente con ^R.

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

En Neovim también existe el

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.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *