Posso fazer um interativo: substitute (search & replace)?

Às vezes eu uso :s com uma expressão regular complicada que pode ou não ser correta, ou não claro se desejo substituir todas as correspondências.

Há alguma maneira de dizer ao Vim para confirmar todas as correspondências que encontrar antes de realmente substituir o texto?

Resposta

Sim! Use o sinalizador 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} 

O exemplo de uso é simples:

%s/old/new/gc 

Isso é muito útil, mas não sabia sobre isso até 2 semanas atrás 🙂 E está até disponível no velho “vi 🙂

Dica bônus: você também pode usar :set nowrapscan; isso evita que o Vim se enrole na parte superior quando atinge a parte inferior. Achei isso especialmente útil ao usar o sinalizador c.

Comentários

  • Eu também acrescentaria que se você deseja substituir todas as instâncias de old na mesma linha (não apenas a primeira ocorrência), você deve adicionar g no final do comando, então no total você terá %s/old/new/gc
  • Ah, sim; eu tenho set gdefault então eu tendo esquecido de adicionar nos exemplos @ e271p314 p3

Resposta

Além do que Carpetsmoker disse:

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

O truque é experimentar seu regex complexo usando apenas / ou ? comando. O Vim usará a configuração &incsearch para mostrar as correspondências interativamente. Onc e você está satisfeito com a regex, pode usar :%s//replacement para que o vim use a pesquisa anterior.

Observe como a parte em // está em branco (é onde você coloca o texto a ser pesquisado). Se você deixar em branco, estará dizendo ao Vim para usar o regex de pesquisa anterior. Com isso, você pode digitar um regex complexo com / e ter todos os benefícios de set incsearch e usar o %s//replacement para realmente executar a pesquisa e substituir.

Se você quiser algo semelhante ao incsearch para :s comandos, verifique vim-over , mas prefiro usar o modo nativo do Vim.

Comentários

  • Eu costumava usar uma variante disso: basta usar :%s/pattern/replace/ e, em seguida, pressionar u para desfazer, você pode ver as partes que o Vim alterou se você tiver hlsearch ativado. E você pode substituir esse texto novamente por ^R.

Resposta

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

Em seguida, selecione combinar usando g n e então s para substituir o texto com o que eu gosto .

E repita movendo para a próxima correspondência e pressionando .

Comentários

  • Este é um truque muito bom, porque é: (1) interativo, (2) você pode ir à partida anterior se pular acidentalmente (algo que você não pode fazer usando :s/old/new/gc).

Resposta

No Neovim também existe o

opção que permite visualizar o resultado do comando :s enquanto você o digita.

Resposta

Para o benefício de todos, incsearch foi atualizado no vim8 para mostrar também uma visualização conforme você digita o padrão

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *