Post

Vim Avançado: Busca, Substituição e Movimentos Precisos

Vim Avançado: Busca, Substituição e Movimentos Precisos

Introdução

No primeiro tutorial, exploramos os fundamentos do Vim, incluindo seus modos de operação e a navegação básica. Agora, vamos aprofundar em funcionalidades que elevam a produtividade a um novo patamar: busca, substituição e movimentos mais precisos. Dominar esses conceitos permitirá que você manipule texto de forma muito mais eficiente, especialmente em arquivos grandes ou ao lidar com padrões complexos.

Busca no Vim

A capacidade de buscar rapidamente por texto é crucial em qualquer editor. O Vim oferece um sistema de busca poderoso e flexível, que vai além da simples localização de palavras. Você pode buscar para frente ou para trás no arquivo, e navegar entre as ocorrências encontradas.

Busca para Frente (/termo)

Para iniciar uma busca para frente (do cursor atual para o final do arquivo), digite / seguido do termo que deseja encontrar e pressione Enter. O Vim realçará a primeira ocorrência encontrada após o cursor.

1
/exemplo

Busca para Trás (?termo)

Similarmente, para buscar para trás (do cursor atual para o início do arquivo), use ? seguido do termo e pressione Enter.

1
?exemplo

Após realizar uma busca, você pode navegar entre as ocorrências encontradas:

  • Pressione n (next) para ir para a próxima ocorrência na mesma direção da busca original.
  • Pressione N (previous) para ir para a ocorrência anterior na direção oposta à busca original.

Desativar Realce de Busca (:noh)

Por padrão, o Vim realça todas as ocorrências do termo buscado. Para desativar temporariamente esse realce, use o comando :noh (no highlight) e pressione Enter.

1
:noh

O realce será reativado na próxima busca.

Expressões Regulares (Regex) Básicas para Busca

As expressões regulares (regex) são sequências de caracteres que definem um padrão de busca. No Vim, elas são extremamente poderosas para encontrar padrões complexos de texto. Entender os caracteres especiais básicos é fundamental para aproveitar ao máximo a busca e substituição.

Caracteres Especiais Comuns

CaractereDescriçãoExemploCorresponde a
.Corresponde a qualquer caractere único (exceto nova linha)./a.bacb, a1b, a#b
*Corresponde a zero ou mais ocorrências do caractere ou grupo anterior./a*bb, ab, aab, aaab
+Corresponde a uma ou mais ocorrências do caractere ou grupo anterior./a+bab, aab, aaab (não b)
?Corresponde a zero ou uma ocorrência do caractere ou grupo anterior./a?bb, ab (não aab)

Âncoras

As âncoras permitem que você especifique a posição do padrão na linha.

CaractereDescriçãoExemploCorresponde a
^Início da linha./^palavrapalavra no início da linha
$Fim da linha./palavra$palavra no fim da linha

Classes de Caractere

As classes de caracteres são atalhos para conjuntos comuns de caracteres.

CaractereDescriçãoExemploCorresponde a
\dQualquer dígito (0-9)./\d+123, 45
\wQualquer caractere de palavra (letras, números, sublinhado)./\w+texto, variavel_1
\sQualquer caractere de espaço em branco (espaço, tab, nova linha)./\s+` , \t`

Limites de Palavra

Esses caracteres são úteis para buscar palavras inteiras, evitando correspondências parciais.

CaractereDescriçãoExemploCorresponde a
\<Início de uma palavra./\<palavrapalavra em palavra_chave
\>Fim de uma palavra./palavra\>palavra em minha_palavra

Exemplo de uso: Para buscar a palavra “Vim” exatamente como uma palavra inteira (não parte de “VimEditor”), você usaria:

1
/\<Vim\>

Dominar essas expressões regulares básicas abrirá um leque de possibilidades para buscas mais complexas e eficientes no Vim.

Substituição com o Comando :s

O comando :s (substitute) é uma das ferramentas mais poderosas do Vim para manipulação de texto. Ele permite encontrar um padrão e substituí-lo por outro, com diversas opções para controlar o escopo e o comportamento da substituição.

Sintaxe Básica

A sintaxe mais simples do comando :s é:

1
:s/padrao/substituicao/

Isso substitui a primeira ocorrência de padrao por substituicao na linha atual.

Substituição Global na Linha (:s/antigo/novo/g)

Para substituir todas as ocorrências de um padrão na linha atual, adicione o flag g (global) ao final do comando:

1
:s/antigo/novo/g

Substituição em Todo o Arquivo (:%s/antigo/novo/g)

Para aplicar a substituição em todas as linhas do arquivo, use o prefixo :% antes do comando :s. O % é um atalho para o intervalo de linhas 1,$ (da primeira à última linha).

1
:%s/antigo/novo/g

Confirmação de Substituição (:%s/antigo/novo/gc)

Se você deseja revisar cada substituição antes de aplicá-la, adicione o flag c (confirm) ao final do comando. O Vim irá parar em cada ocorrência e perguntar se você deseja substituir (y), não substituir (n), substituir todas (a), sair (q), ou substituir a atual e sair (l).

1
:%s/antigo/novo/gc

Uso de Expressões Regulares em Substituições

O verdadeiro poder do comando :s reside na sua capacidade de usar expressões regulares tanto no padrao quanto na substituicao. Você pode usar os caracteres especiais de regex que vimos anteriormente para criar padrões de busca complexos.

Além disso, você pode referenciar partes do padrão encontrado na string de substituição usando grupos de captura. Os grupos de captura são definidos por parênteses \( e \) no padrão, e referenciados por \1, \2, etc., na substituição.

Exemplo: Inverter a ordem de nome e sobrenome separados por vírgula.

Texto original:

1
2
Silva, João
Souza, Maria

Comando:

1
:%s/\(.*\), \(.*\)/\2 \1/

Resultado:

1
2
João Silva
Maria Souza

Neste exemplo:

  • \(.*\) captura qualquer sequência de caracteres antes da vírgula no primeiro grupo (\1).
  • \(.*\) captura qualquer sequência de caracteres após a vírgula e espaço no segundo grupo (\2).
  • Na substituição, \2 \1 inverte a ordem, colocando o segundo grupo (nome) antes do primeiro grupo (sobrenome).

O comando :s é uma ferramenta indispensável para refatoração de código, limpeza de dados e qualquer tarefa que envolva a transformação de texto em larga escala.

Substituição em Massa com Comandos Globais (:g e :v)

Os comandos globais :g (global) e :v (inverse global) no Vim são extremamente poderosos para executar comandos em linhas que correspondem (ou não correspondem) a um determinado padrão. Eles permitem automatizar tarefas complexas de edição em massa.

Aplicar Comandos em Linhas que Correspondem a um Padrão (:g/padrao/comando)

A sintaxe básica do comando :g é:

1
:g/padrao/comando

Isso executa comando em todas as linhas que contêm padrao. O comando pode ser qualquer comando do Modo Normal ou do Modo de Linha de Comando.

Exemplo: Deletar todas as linhas que contêm a palavra “DEBUG”.

1
:g/DEBUG/d

Aplicar Comandos em Linhas que NÃO Correspondem a um Padrão (:v/padrao/comando)

O comando :v é o inverso de :g. Ele executa comando em todas as linhas que não contêm padrao.

1
:v/padrao/comando

Exemplo: Manter apenas as linhas que contêm a palavra “ERROR” (deletar todas as outras).

1
:v/ERROR/d

Exemplos Práticos

Deletar Linhas Vazias

Para deletar todas as linhas completamente vazias (que não contêm nenhum caractere, nem mesmo espaços):

1
:g/^$/d

Para deletar linhas que contêm apenas espaços em branco:

1
:g/^[ \t]*$/d

Comentar/Descomentar Blocos de Código

Suponha que você queira comentar todas as linhas entre a linha 10 e a linha 20 com //.

1
:10,20g/^/normal I//

Neste exemplo:

  • 10,20 define o intervalo de linhas.
  • g/^/ significa “para cada linha que começa com qualquer coisa” (ou seja, todas as linhas no intervalo).
  • normal I// executa o comando do Modo Normal I// (inserir // no início da linha) em cada linha correspondente.

Para descomentar as mesmas linhas:

1
:10,20s/^\/\///

Neste exemplo:

  • s/^\/\/// substitui // no início da linha por nada. Os caracteres / precisam ser escapados com \.

Os comandos :g e :v são incrivelmente versáteis e, combinados com expressões regulares e outros comandos do Vim, permitem realizar edições complexas e automatizadas que seriam tediosas de fazer manualmente.

Movimentos Precisos e Saltos

Além da navegação básica que vimos no primeiro tutorial, o Vim oferece comandos de movimento mais precisos e atalhos para saltar rapidamente para locais específicos no texto. Dominar esses movimentos acelera ainda mais a sua edição.

Movimento por Caractere Específico na Linha

Esses comandos permitem saltar para a próxima (ou anterior) ocorrência de um caractere específico na linha atual.

TeclaAção
f<char>Find: Move o cursor para a próxima ocorrência de <char> na linha.
t<char>To: Move o cursor para antes da próxima ocorrência de <char> na linha.
F<char>Find (para trás): Move o cursor para a ocorrência anterior de <char> na linha.
T<char>To (para trás): Move o cursor para depois da ocorrência anterior de <char> na linha.

Após usar f, t, F ou T, você pode repetir o último movimento com ; (próxima ocorrência) ou , (ocorrência anterior).

Exemplo: Para ir para a próxima vírgula na linha, digite f,. Para ir para a próxima vírgula novamente, digite ;.

Saltos entre Parágrafos/Blocos

Esses comandos são úteis para navegar rapidamente entre blocos de texto ou parágrafos.

TeclaAção
{Move o cursor para o início do parágrafo anterior.
}Move o cursor para o início do próximo parágrafo.

Um “parágrafo” no Vim é definido por linhas vazias. Isso é particularmente útil para navegar em arquivos de código, onde funções ou blocos de código são frequentemente separados por linhas em branco.

Saltos na Lista de Alterações (g;, g,)

O Vim mantém um histórico de todas as alterações que você fez no arquivo. Você pode saltar para os locais onde as alterações ocorreram.

TeclaAção
g;Move o cursor para o local da alteração anterior no histórico.
g,Move o cursor para o local da próxima alteração no histórico.

Saltos na Lista de Marcas (\', `)

You can define “marcas” (marks) in your file to return quickly to specific points. Marks are useful for quick navigation between sections of a file or between different files.

TeclaAção
m<letra>Define uma marca com a letra especificada (ex: ma para marcar a posição a).
\'<letra>Move o cursor para o início da linha onde a marca <letra> foi definida.
`<letra>Move o cursor para a posição exata onde a marca <letra> foi definida.
\''Move o cursor para o início da linha onde estava antes do último salto.
`Move o cursor para a posição exata onde estava antes do último salto.

Exemplo: Para marcar sua posição atual, digite ma. Mais tarde, para retornar àquela linha, digite \'a. Para retornar à posição exata, digite `a.

Dominar esses movimentos precisos e saltos permitirá que você se mova pelo seu código e texto com uma agilidade impressionante, tornando a edição no Vim ainda mais fluida e eficiente.

This post is licensed under CC BY 4.0 by the author.