Pesquisa interativa / substituir regex no Vim?

265

Conheço o regex para fazer uma substituição global,

     %s/old/new/g

Como você substitui a pesquisa interativa no Vim ?

kal
fonte

Respostas:

463

Adicione o sinalizador c (no prompt de comando do vim):

:%s/old/new/gc

fornecerá um aviso sim / não em cada ocorrência de 'antigo'.

"old" é destacado no texto;  na parte inferior da janela, diz "substituir por novo (s / n / a / q / l / ^ E / ^ y)?)"

A ajuda interna do Vim oferece informações úteis sobre as opções disponíveis após a seleção da substituição com confirmação. Usar:

:h :s

Em seguida, role até a seção sobre opções de confirmação. Captura de tela abaixo:

Texto que diz "[C] Confirme cada substituição. [...] CTRL-Y para rolar a tela para baixo"

Por exemplo, para substituir esta e todas as correspondências restantes, use a.

Mark Biek
fonte
30
+1, eu aprendi algo novo hoje! vim tem tantos segredos escondidos .. :)
Marc Novakowski
10
Aprender comandos do vim é um pouco como jogar o Nethack. Você nunca sabe o que maravilhas um único personagem irá realizar.
22430 Mark Biek
22
Eu imagino que o "c" é para "confirmar"
matpie
8
Sinceramente, não estou tentando parecer desagradável, mas tudo isso pode ter sido encontrado com ": help: s", o que o levaria diretamente a ": help: s_flags".
Jeremy Cantrell
13
@jeremy: isso requer saber que existe um comando de ajuda e saber que é preciso digitar a opção "dois pontos" para levá-lo ao arquivo de ajuda relevante. Como ou onde alguém aprenderia isso?
Dennis
79

Mark Biek apontou usando:

%s/old/new/gc

para uma pesquisa global, substitua pela confirmação de cada substituição. Mas também gosto de verificar interativamente que o texto antigo corresponderá corretamente. Primeiro faço uma pesquisa com uma regex e depois reutilizo esse padrão:

/old.pattern.to.match
%s//replacement/gc

O s//usará o último padrão de pesquisa.

Vincent Scheib
fonte
9
Uma das melhores coisas sobre o uso / aprendizado do vim é a profundidade da toca do coelho!
ken
2
Bom, eu estava sempre fazendo a pesquisa e usando <Cr> / para colar a última pesquisa no comando substitute.
Atilla Filiz
Exatamente o que sinto falta do Sublime Text!
Xenofex 30/08/16
Essa resposta é particularmente útil, pois imagino que muitas vezes você decide substituir instâncias de uma palavra, é a palavra que você acabou de pesquisar.
M_M 11/02
20

Acho que você está procurando c, por exemplo s/abc/123/gc, isso fará com que o VIM confirme as substituições. Consulte: help: substitua para obter mais informações.

Logan Capaldo
fonte
9

Eu costumo usar o comando find / substitute / next / repeat :-)

/old<CR>3snew<ESC>n.n.n.n.n.n.n.

Aquela find "old", substitute 3 characters for "new", find next,repeat substitute , e assim por diante.

É uma dor para substituições maciças, mas permite que você ignore seletivamente algumas ocorrências antigas (apenas pressionando nnovamente para encontrar a próxima em vez de .repetir uma substituição).

paxdiablo
fonte
Eu também uso isso, mesmo para textos semelhantes. (3cW <texthere> <ESC> <mover para um novo local>. <move>. <move>.)
strager
1
Não é um antipadrão! É doce. E você pode pesquisar na direção oposta usando N. Muito bom se vir uma palavra e quiser alterá-la. * cwNewText <ESC> Nnn (Isso irá pular para longe da palavra sob o cursor, mas depois voltará assim que você tiver alterado a próxima ocorrência.
PEZ 03/02/09
o que é <CR>?
Sother
9

Se você quiser apenas contar o número de ocorrências de 'abc', pode fazer %s/abc//gn. Isso não substitui nada, mas apenas informa o número de ocorrências de 'abc'.

Amjith
fonte
3

Se o texto de substituição precisar ser alterado para cada ocorrência correspondente (ou seja, não basta escolher Sim / Não para aplicar uma substituição singular), você poderá usar um plug-in do Vim que criei chamado substituição interativa .

hwrod
fonte