Fundamentos do Vim: Comandos Essenciais e Técnicas Práticas

Fundamentos do Vim: Comandos Essenciais e Técnicas Práticas

O que você vai conseguir fazer

  • Alternar os modos e sair sozinho de uma sessão travada
  • Escolher entre salvar, descartar e forçar a saída
  • Executar busca e substituição com segurança no modo de confirmação

Pré-requisitos (leia estes primeiro)

O Que Você Vai Aprender

  • Você vai conseguir alternar os modos do Vim e sair sozinho de uma sessão travada.
  • Você vai dominar o fluxo de trabalho mínimo de movimentação, edição e busca/substituição usado no trabalho real.
  • Você vai conseguir escolher entre salvar, descartar e forçar a saída conforme a situação.
  • Você vai conseguir configurar um .vimrc confortável para qualquer novo servidor.
  • Você vai continuar produtivo quando apenas o vi está instalado em uma máquina remota.

Para quem é: quem agora precisa entrar por SSH em um servidor e corrigir um arquivo de configuração. Se você já abriu o Vim e não conseguiu fechar, este artigo é para você.

Termos definidos antes de começar

Cada termo que os guias de Vim pressupõem está definido uma única vez, aqui.

  • Um modo é o estado atual que decide o que uma tecla faz. O Vim mantém separados o estado de movimentação e o estado de digitação.
  • O modo normal é o estado de mover, excluir e copiar. Alguns materiais o chamam de "modo de comando", mas este artigo diz "modo normal" para não confundir com o modo de linha de comando abaixo.
  • O modo de inserção é o estado em que cada tecla pressionada coloca aquele caractere no texto.
  • O modo de linha de comando é o estado em que você entra com : para digitar instruções como salvar, sair ou substituir. Também são chamadas de comandos Ex.
  • Um buffer é o conteúdo do arquivo que o Vim mantém em memória. Editar o buffer ainda não altera o arquivo em disco: o arquivo muda apenas quando :w grava.
  • Yank é o nome que o Vim dá a operação de copiar. Leia como "copiar".
  • Um arquivo de swap é um arquivo oculto .swp que guarda as edições em andamento, para que o conteúdo possa ser recuperado depois de uma saída anormal.

Resumo Rápido (o fluxo de trabalho prático)

  • Após iniciar, sempre pense primeiro em modo normal (Esc)
  • O ciclo de edição é: i -> editar -> Esc -> :w -- quatro passos
  • Se ficar preso, pressione Esc duas vezes, depois :q! para forçar a saída
  • Para arquivos de configuração, use sudoedit, não sudo vim

Ambiente assumido

  • SO: Ubuntu ou qualquer Linux
  • Vim 8+ ou Neovim (peculiaridades de compatibilidade com vi são anotadas)
  • Principalmente trabalho remoto em servidor via SSH

1. Modos: 80% da Batalha

Conclusão: A dificuldade do Vim são seus modos; aprenda normal, inserção, visual e linha de comando primeiro.

A principal razão pela qual iniciantes desistem do Vim são os modos. Uma vez que você os internaliza, o resto é apenas memorizar comandos.

Modo Como entrar O que você pode fazer
Normal Esc Mover, excluir, copiar
Inserção i / a / o Digitar texto
Visual v / V Selecionar intervalos
Linha de comando : Salvar, sair, substituir

Regra geral: Quando algo estranho acontecer, pressione Esc duas vezes para voltar ao modo normal.

Você identifica o modo atual no canto inferior esquerdo da tela: -- INSERT -- no modo de inserção, -- VISUAL -- no modo visual e nada quando está no modo normal. Pressionar Esc nunca causa dano, então pressione sempre que estiver em dúvida.

1-1. Entrando no Modo de Inserção (Qual Tecla Usar)

i   # Inserir antes do cursor
a   # Inserir apos o cursor (otimo no final da linha)
o   # Abrir nova linha abaixo
O   # Abrir nova linha acima
I   # Inserir no inicio da linha
A   # Inserir no final da linha

No início, use apenas i e o. Quando estiver confortável, A (adicionar no final) se torna uso diário.

2. Salvar e Sair: O Ponto de Travamento Número 1

Conclusão: :w salva, :wq salva e sai, :q! descarta; esses três resolvem o problema de travamento.

É daqui que vêm os memes "não consigo sair do Vim". Memorize esta seção.

:w           # Gravar (salvar)
:q           # Sair
:wq          # Salvar e sair
:x           # Salvar e sair (so grava se houver alteracoes)
ZZ           # Mesmo que :wq no modo normal
:q!          # Sair sem salvar
:w !sudo tee % > /dev/null   # Salvar um arquivo que voce esqueceu de abrir com sudo (detalhes em 2-1)

:q simples se recusa a sair se houver alterações não salvas. Use :q! para descartar, :wq para mantê-las.

2-1. Recuperando-se de um Erro com sudo

Acidente clássico: abrir /etc/something com vim, editar, e receber Permission denied ao salvar.

:w !sudo tee % > /dev/null
  • % expande para o nome do arquivo atual
  • tee grava no disco; > /dev/null descarta stdout
  • Após salvar, :q! (o arquivo já está no disco, então ! é seguro)

A correção adequada: edite arquivos de configuração com sudoedit /etc/ssh/sshd_config (alias sudo -e). Ele abre uma cópia temporária e grava de volta ao sair.

3. Movimentação: Dispense o Mouse

Conclusão: Mova-se com hjkl, por palavra, linha, tela ou busca, tudo no modo normal.

Estes funcionam apenas no modo normal. Não fazem nada no modo de inserção.

3-1. Nível de Caractere

h j k l   # esquerda baixo cima direita

Mnemônico: j parece um gancho indo para baixo, k sobe como um soco.

3-2. Palavra, Linha, Tela

w / b      # Inicio da proxima / anterior palavra
e          # Final da palavra
0 / ^ / $  # Inicio da linha / primeiro nao-branco / final da linha
gg / G     # Topo / final do arquivo
:42        # Pular para a linha 42
Ctrl-d / Ctrl-u   # Meia tela baixo / cima
Ctrl-f / Ctrl-b   # Tela inteira baixo / cima

3-3. Movimentação Baseada em Busca

/word      # Buscar para frente
?word      # Buscar para tras
n / N      # Proxima / anterior ocorrencia
*          # Buscar para frente a palavra sob o cursor

Dica prática: Quando estiver acompanhando um log, pressione G para pular ao final, depois ?ERROR para buscar para trás.

4. Edição: O Mínimo Necessário

Conclusão: Poucos comandos cobrem edições diárias: x, dd, yy, p, u e o ponto de repetição.

x          # Excluir um caractere
dd         # Excluir uma linha (para a area de transferencia)
3dd        # Excluir 3 linhas
dw         # Excluir uma palavra
d$ / D     # Excluir ate o final da linha
yy         # Copiar (yank) uma linha
3yy        # Copiar 3 linhas
p / P      # Colar (apos / antes)
u          # Desfazer
Ctrl-r     # Refazer
.          # Repetir ultima alteracao

O comando mais poderoso é . (ponto). Ele repete sua última edição. Execute dw uma vez, mova o cursor, pressione . -- mesma edição aplicada.

4-1. Prefixos Numéricos

Praticamente qualquer comando aceita um prefixo de contagem.

5j         # Mover 5 linhas para baixo
10x        # Excluir 10 caracteres
3yy        # Copiar 3 linhas

5. Busca e Substituição: Ferramenta do Dia a Dia

Conclusão: Busque com /pattern e substitua com :%s/foo/bar/g; use gc para confirmar com segurança.

5-1. Busca

/pattern   # Para frente (regex permitido)
?pattern   # Para tras
n / N      # Proxima / anterior

5-2. Substituição (A Importante)

:s/foo/bar/        # Primeira ocorrencia na linha atual
:s/foo/bar/g       # Todas as ocorrencias na linha atual
:%s/foo/bar/g      # Todas as ocorrencias no arquivo
:%s/foo/bar/gc     # Mesmo, com confirmacao
:5,10s/foo/bar/g   # Apenas linhas 5-10

A g final (global) significa "toda ocorrência da linha", a c (confirm) significa "perguntar a cada uma" e o % define o alcance como o arquivo inteiro.

5-3. Armadilhas de Regex

O dialeto regex do Vim difere sutilmente do regex estendido POSIX.

:%s/\v(\w+)\s+\1/\1/g   # \v habilita "very magic" -- mais proximo do regex padrao

Com \v, você não precisa mais escapar (), + ou ?. Salve como memória muscular; isso evita muita dor de cabeça.

6. Múltiplos Arquivos e Janelas

Conclusão: Alterne arquivos com buffers e visualize-os lado a lado com janelas divididas.

6-1. Buffers (Múltiplos Arquivos)

:e other.txt    # Abrir outro arquivo
:ls             # Listar buffers abertos
:b 2            # Mudar para o buffer 2
:bn / :bp       # Proximo / anterior buffer
:bd             # Fechar buffer

6-2. Janelas Divididas

:sp file.txt    # Divisao horizontal
:vsp file.txt   # Divisao vertical
Ctrl-w w        # Alternar entre janelas
Ctrl-w q        # Fechar janela atual
Ctrl-w =        # Equalizar tamanhos das janelas

Uma configuração comum: logs de um lado, arquivo de configuração do outro. Combine com tmux via SSH para um fluxo de trabalho ainda mais forte.

7. Modo Visual: Operar em uma Seleção

Conclusão: Selecione um intervalo com v, V ou Ctrl-v, depois exclua, copie, indente ou substitua.

v          # Iniciar selecao por caractere
V          # Iniciar selecao por linha
Ctrl-v     # Iniciar selecao em bloco (retangular)

Com uma seleção ativa:

d          # Excluir
y          # Copiar
>          # Indentar
<          # Desindentar
:s/a/b/    # Substituir apenas na selecao

Truque de seleção em bloco: Para prefixar múltiplas linhas com # (comentá-las), use Ctrl-v -> selecione linhas -> I -> # -> Esc. Isso aplica o prefixo a todas as linhas selecionadas de uma vez.

8. .vimrc: Uma Configuração Mínima

Conclusão: Coloque um ~/.vimrc mínimo com números de linha, busca e indentação para conforto.

Escreva isso em ~/.vimrc. É pequeno o suficiente para que você possa redigitá-lo em um servidor novo em 30 segundos.

" Basico
set number              " Mostrar numeros de linha
set ruler               " Mostrar posicao do cursor
set showcmd             " Mostrar comandos parciais
set wildmenu            " Melhor completacao de comandos

" Busca
set hlsearch            " Destacar correspondencias
set incsearch           " Busca incremental
set ignorecase          " Ignorar maiusculas/minusculas
set smartcase           " Mas sensivel se o padrao tiver maiusculas

" Indentacao
set autoindent          " Auto indentar
set expandtab           " Tab -> espacos
set tabstop=4           " Largura do tab
set shiftwidth=4        " Largura da indentacao

" Seguranca
set backup              " Manter arquivos de backup
set backupdir=~/.vim/backup,/tmp
set undofile            " Desfazer persistente
set undodir=~/.vim/undo

" Interface
syntax on               " Realce de sintaxe
set background=dark     " Assumir terminal escuro

Crie os diretórios primeiro: mkdir -p ~/.vim/backup ~/.vim/undo.

Em um servidor com apenas vi (modo de compatibilidade do Vim), algumas opções set falham silenciosamente. Verifique :version para ver o que está disponível.

9. Rotas de Fuga Quando Preso

Conclusão: Estados presos como não conseguir sair ou salvar têm rotas de fuga mecânicas.

Estados presos comuns e a correção mecânica.

9-1. Não Consigo Sair

Esc Esc :q!

Sempre volte ao modo normal primeiro, depois force a saída.

9-2. Não Consigo Salvar (Somente Leitura)

:set noreadonly
:w

Ou use o truque do sudo: :w !sudo tee % > /dev/null.

9-3. Tela Congelada

Ctrl-q        # Retomar um terminal parado por Ctrl-s

Ctrl-s pausa o próprio terminal -- não é um problema do Vim.

9-4. Uma Coluna de ~ na Borda Esquerda

Isso não é falha. O ~ é a marca normal do Vim para "aqui não existe linha" e sempre preenche a área abaixo do fim do arquivo. Não há o que corrigir.

Da mesma forma, encontrar arquivos extras como file.txt~ depois de editar não é falha. São arquivos de backup criados pelo set backup do seu .vimrc (visto adiante), algo diferente de um arquivo de swap. Exclua-os se não quiser mantê-los.

9-5. E325: ATTENTION na Inicialização

Um arquivo swap (.swp) ficou para trás. É sinal de que o Vim não encerrou de forma limpa na última vez, ou de que outra pessoa tem o mesmo arquivo aberto.

E325: ATTENTION
Found a swap file by the name ".file.txt.swp"
ls -la .*.swp
:recover       # Execute dentro do Vim

Confira o que o :recover restaura, salve o que precisar e só então execute rm .file.txt.swp. Os nomes de arquivo swap seguem a forma ". + nome original + .swp".

10. vi vs Vim vs Neovim

Conclusão: vi geralmente é o modo de compatibilidade do Vim, Vim é o padrão, Neovim é um fork moderno.

Nome O que realmente é Notas
vi Geralmente Vim executando em modo compatível Algumas configurações desabilitadas
Vim Vi IMproved O padrão de fato
Neovim Um fork do Vim Config Lua, LSP integrado, internos modernos
which vi
ls -l $(which vi)
/usr/bin/vi
lrwxrwxrwx 1 root root 20 Feb 15  2024 /usr/bin/vi -> /etc/alternatives/vi

O que está à direita do -> é o binário real. No Ubuntu ele passa por /etc/alternatives/vi e chega a vim.basic ou vim.tiny. Qual deles é decide quais configurações estão disponíveis.

Instalações mínimas do Ubuntu podem ter apenas vim-tiny. Instale a versão completa com sudo apt install vim.

11. Resumo: O Fluxo de Trabalho Que Você Usará Amanhã

Modelo para copiar e colar: fluxo de trabalho mínimo diário

# 1. Abrir
vim file.txt

# 2. Mover no modo normal
gg              # Topo do arquivo
/keyword        # Buscar

# 3. Mudar para modo de insercao
i               # Comecar a editar
(editar)
Esc             # Voltar ao normal

# 4. Salvar e sair
:wq

# Se errar
:q!             # Descartar e sair

Checklist de Conclusão

  • [ ] Identificou o modo atual pelo indicador no canto inferior esquerdo
  • [ ] Escolheu de forma deliberada entre :wq (salvar e sair) e :q! (descartar e sair)
  • [ ] Conferiu os alvos com /pattern antes de uma substituição global
  • [ ] Editou arquivos de configuração via sudoedit ou após fazer backup
  • [ ] Executou ps aux | grep vim antes de excluir um arquivo .swp

Não faça isso

  • Digitar :wq enquanto ainda está no modo de inserção (você escreve :wq no arquivo)
  • Abrir um arquivo com sudo vim /etc/... e ficar preso ao salvar -- use sudoedit em vez disso
  • Excluir reflexivamente arquivos .swp -- alguém pode estar editando
  • Inchar seu .vimrc -- ele deixa de ser portatil entre servidores

Próximas Leituras