¿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?

Martin Tournoij
fuente

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.

Martin Tournoij
fuente
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.

akshay
fuente
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.

Neaţu Ovidiu Gabriel
fuente
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.

Lucas
fuente
1

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

Dhruva Sagar
fuente