Posso fazer um substituto interativo (pesquisar e substituir)?


17

Às vezes, uso :scom uma regexp complicada que pode ou não estar correta ou não tenho certeza se quero substituir todas as correspondências.

Existe alguma maneira de dizer ao Vim para confirmar todas as correspondências que encontrar antes que ele realmente substitua o texto?

Respostas:


20

Sim! Use a cbandeira 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}

Exemplo de uso é simples como torta:

%s/old/new/c

Isso é muito útil, mas não sabia disso até 2 semanas atrás :-) E está disponível no ol 'vi :-)

Dica de bônus: você também pode querer usar :set nowrapscan; isso evita que o Vim seja agrupado na parte superior quando atingir o fundo. Eu achei isso especialmente útil ao usar a cflag.


19

Além do que Carpetsmoker disse:

A configuração &incsearch( set incsearch) no Vim é realmente útil. Você pode usá-lo junto com um truque útil e pouco conhecido.

O truque é testar sua regex complexa usando o comando /ou ?O Vim usará a &incsearchconfiguração para mostrar correspondências interativamente. Quando estiver satisfeito com a regex, você poderá usar o :%s//replacementvim para usar a pesquisa anterior.

Observe como a parte //está em branco (é onde você coloca o texto para pesquisar). Se você deixar em branco, estará dizendo ao Vim para usar o regex de pesquisa anterior. Com isso, você pode digitar uma regex complexa com /todos os benefícios set incsearche, em seguida, usar o %s//replacementcomando para realmente executar a pesquisa e a substituição.

Se você quiser algo semelhante ao incsearch de :scomandos, consulte o vim-over , mas eu prefiro usar o modo nativo do Vim.


Eu costumava usar uma variante disso: basta usar :%s/pattern/replace/e pressionar upara desfazer, você pode ver as partes que o Vim mudou se tiver hlsearchativado. E você pode substituir este texto novamente por ^R.
Martin Tournoij

7

Minha substituição interativa favorita é pesquisar usando /e percorrer as correspondências usando n.

Em seguida, selecione jogo usando gne, em seguida, spara substituir o texto com o que eu gosto.

E repita movendo para a próxima partida e pressionando.


Esse é um truque muito bom, porque é: (1) interativo, (2) você pode ir para a partida anterior se a ignorar acidentalmente (algo que você não pode usar :s/old/new/gc).
Ayrat 12/09/18

3

No Neovim, há também a 'inccommand'opção que permite visualizar o resultado do :scomando enquanto você o digita.


1

Para o benefício de todos, incsearchfoi atualizado no vim8 para mostrar também a visualização à medida que você digita o padrão

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.