À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 adicionarg
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
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
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
:%s/pattern/replace/
e, em seguida, pressionaru
para desfazer, você pode ver as partes que o Vim alterou se você tiverhlsearch
ativado. E você pode substituir esse texto novamente por^R
.