Busca e substituição

    Definição curta: A busca (/) e o :substitute são as ferramentas de edição em massa do Neovim, e ambas dependem do dialeto de expressão regular do Vim.

    Antes de começar

    • Saber sair do Neovim (:q) e navegar em modo normal

    O que você vai aprender

    • Explicar Busca com suas palavras
    • Explicar Os modos de magia com suas palavras
    • Explicar O comando :substitute com suas palavras
    • Localizar o assunto desta página no :help do seu próprio Neovim

    Busca

    /padrao        " busca para a frente
    ?padrao        " busca para trás
    n / N          " próxima / anterior ocorrência
    *  / #         " busca a palavra sob o cursor, adiante / atrás

    Opções que mudam o comportamento:

    vim.opt.ignorecase = true   -- busca sem diferenciar maiúsculas
    vim.opt.smartcase  = true   -- ...exceto se o padrão tiver maiúscula
    vim.opt.incsearch  = true   -- mostra o resultado enquanto digita
    vim.opt.hlsearch   = true   -- destaca todas as ocorrências

    A combinação ignorecase + smartcase é quase universal: /erro acha Erro e ERRO, mas /Erro acha só Erro.

    Para limpar o destaque: :noh. Um mapeamento comum:

    vim.keymap.set('n', '<Esc>', ':nohlsearch<CR>', { silent = true })

    Os modos de magia

    O dialeto de expressão regular do Vim difere do PCRE, e o quanto ele difere depende do prefixo:

    PrefixoNomeComportamento
    \vvery magicmais próximo de PCRE — (, +, ?, { funcionam sem escape
    (nenhum)magic (padrão). e * especiais; +, ?, ( precisam de \
    \Vvery nomagicquase tudo literal; só \ é especial

    Comparação do mesmo padrão:

    /\v(foo|bar)+          " very magic
    /\(foo\|bar\)\+        " magic, o padrão
    /\Vfoo.bar             " very nomagic: ponto literal

    Recomendação prática: use \v sempre. Ele elimina a maior parte das barras invertidas e aproxima a sintaxe do que você já conhece de outras ferramentas.

    O comando :substitute

    :s/velho/novo/          " primeira ocorrência da linha
    :s/velho/novo/g         " todas da linha
    :%s/velho/novo/g        " todas do arquivo
    :%s/velho/novo/gc       " com confirmação a cada uma
    :'<,'>s/velho/novo/g    " apenas na seleção visual
    :10,20s/velho/novo/g    " nas linhas 10 a 20

    As flags mais úteis: g (todas da linha), c (confirmar), i (ignorar caixa), I (diferenciar caixa), n (só contar, não substituir).

    A flag n é subestimada: :%s/erro//gn responde “quantas vezes isso aparece?” sem alterar nada.

    Grupos de captura

    :%s/\v(\w+)\s+(\w+)/\2 \1/g       " troca duas palavras de lugar
    :%s/\v"(.{-})"/'\1'/g             " aspas duplas viram simples

    \1, \2… referenciam os grupos. .{-} é o quantificador não guloso — o equivalente ao .*? de PCRE, e um dos que mais faltam a quem chega de outra ferramenta.

    Substituir em vários arquivos

    O caminho nativo passa pela quickfix:

    :grep -r 'padrao' .        " popula a quickfix
    :cdo s/padrao/novo/g | update

    :cdo executa um comando em cada entrada da lista quickfix; | update salva os arquivos que mudaram. Para a lista de argumentos, o equivalente é :argdo.

    Com ripgrep instalado, vale configurar:

    vim.opt.grepprg = 'rg --vimgrep --smart-case'
    vim.opt.grepformat = '%f:%l:%c:%m'

    Expressões no lado direito

    Prefixar a substituição com \= avalia uma expressão:

    :%s/\v^/\=line('.') . '. '/     " numera todas as linhas
    :%s/\v\d+/\=submatch(0) * 2/g   " dobra todo número do arquivo

    Erros comuns

    • Esquecer \v e depurar barras invertidas por dez minutos
    • .* onde cabia .{-} — o quantificador guloso engole a linha inteira
    • :%s sem g achando que pegou tudo — pegou a primeira de cada linha
    • :cdo sem update — as mudanças ficam em buffers não salvos
    • Usar sintaxe PCRE por hábito\d funciona, mas \w+ sem \v não

    Você aprendeu

    • Busca
    • Os modos de magia
    • O comando :substitute
    • Grupos de captura
    • Substituir em vários arquivos

    Perguntas para reflexão

    1. O que Busca resolve, e o que se perde sem isso?
    2. O que Os modos de magia resolve, e o que se perde sem isso?
    3. O que O comando :substitute resolve, e o que se perde sem isso?
    4. Qual parte desta página você conseguiria reproduzir sem consultar, direto no editor?

    Artigos relacionados

    Veja também

    Referências

    • :help pattern — a sintaxe completa
    • :help :substitute
    • :help /magic — os quatro modos de magia