¿Puedo hacer un interactivo: sustituto (buscar y reemplazar)?


17

A veces lo uso :scon una expresión regular complicada que puede ser correcta o no, o no estoy seguro de si quiero reemplazar todas las coincidencias.

¿Hay alguna forma de decirle a Vim que confirme cada coincidencia que encuentre antes de que realmente reemplace el texto?

Respuestas:


20

¡Si! Usa la cbandera 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 uso de ejemplo es simple como pastel:

%s/old/new/c

Esto es muy útil, pero no lo sabía hasta hace 2 semanas :-) E incluso está disponible en ol 'vi :-)

Consejo de bonificación: también puede usar :set nowrapscan; esto evita que Vim se enrolle hacia arriba cuando toca el fondo. He encontrado que esto es especialmente útil al usar la cbandera.


19

Además de lo que dijo Carpetsmoker:

La configuración &incsearch( set incsearch) en Vim es realmente útil. Puedes usarlo junto con un truco útil y poco conocido.

El truco es probar su expresión regular compleja simplemente usando el comando /o ?. Vim usará la &incsearchconfiguración para mostrar coincidencias de forma interactiva. Una vez que esté satisfecho con la expresión regular, puede usar :%s//replacementpara que vim use la búsqueda anterior.

Observe cómo la parte //está en blanco (ahí es donde coloca 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//replacementcomando para ejecutar realmente la búsqueda y el reemplazo.

Si desea algo similar a incsearch para los :scomandos, consulte vim-over , pero prefiero usar la forma nativa de Vim.


Solía ​​usar una variante de esto: solo use :%s/pattern/replace/y luego presione upara deshacer, puede ver las partes que Vim cambió si ha hlsearchhabilitado. Y puede reemplazar este texto nuevamente con ^R.
Martin Tournoij

7

Mi sustitución interactiva favorita es buscar usando /y recorrer las coincidencias usando n.

Luego selecciona match usando gny luego spara sustituir el texto con lo que quiera.

Y repita moviéndose al siguiente partido y presionando.


Este es un truco muy bueno, porque es: (1) interactivo, (2) puedes ir a la partida anterior si accidentalmente lo omitiste (algo que no puedes hacer usando :s/old/new/gc).
Ayrat

3

En Neovim también existe la 'inccommand'opción que le permite previsualizar el resultado del :scomando mientras lo escribe.


1

Para beneficio de todos, incsearchse actualizó en vim8 para mostrar también la vista previa a medida que escribe el patrón

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.