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
.vimrcconfortável para qualquer novo servidor. - Você vai continuar produtivo quando apenas o
viestá 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
:wgrava. - Yank é o nome que o Vim dá a operação de copiar. Leia como "copiar".
- Um arquivo de swap é um arquivo oculto
.swpque 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
Escduas vezes, depois:q!para forçar a saída - Para arquivos de configuração, use
sudoedit, nãosudo 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.
O :q! joga suas edições fora
O ! significa "faça sem perguntar". O que acontece quando dá errado é inequívoco: sair com :q! perde todas as edições feitas, e o undo não as traz de volta.
Como se manter seguro se resume a dois hábitos.
- Se estiver em dúvida entre manter e descartar, salve uma cópia primeiro com
:w ~/backup.txte depois saia com:q!. - Antes de editar um arquivo de configuração, faça uma cópia com
cp /etc/ssh/sshd_config ~/sshd_config.bak. Crie o caminho de volta antes de começar.
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 atualteegrava no disco;> /dev/nulldescarta 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.
A substituição global reescreve o texto de uma vez
O :%s/foo/bar/g reescreve o arquivo inteiro de uma só vez. O que acontece quando dá errado é o seguinte:
- Um padrão amplo demais substitui trechos que você nunca quis tocar. Em um arquivo de configuração isso quebra a sintaxe e o serviço deixa de iniciar.
- Logo após a substituição, o
u(undo) ainda reverte. Depois de salvar com:we sair do Vim, o histórico de undo se perde e não há como reverter (a menos queset undofileesteja habilitado).
Como se manter seguro leva três passos.
- Busque com
/fooprimeiro e veja quantas ocorrências existem e onde estão. - Execute o modo de confirmação,
:%s/foo/bar/gc, e decida caso a caso comy(sim),n(não),a(todas as restantes),q(sair). - Se substituiu algo indesejado, pressione
uantes de salvar.
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".
Nunca exclua um arquivo swap por reflexo
Excluir o .swp também apaga as edições não salvas guardadas nele. O que acontece quando dá errado tem duas faces.
- Você destrói seu próprio trabalho não salvo, justamente o conteúdo que o
:recoverpoderia recuperar. - Se outra pessoa estiver editando esse mesmo arquivo agora, você quebra a sessão dela.
Como se manter seguro é confirmar duas coisas antes de excluir.
ps aux | grep vim # alguem esta editando agora?
Exclua somente quando não houver processo de edição e você tiver confirmado que o conteúdo do :recover não é necessário.
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
/patternantes de uma substituição global - [ ] Editou arquivos de configuração via
sudoeditou após fazer backup - [ ] Executou
ps aux | grep vimantes de excluir um arquivo.swp
Não faça isso
- Digitar
:wqenquanto ainda está no modo de inserção (você escreve:wqno arquivo) - Abrir um arquivo com
sudo vim /etc/...e ficar preso ao salvar -- usesudoeditem vez disso - Excluir reflexivamente arquivos
.swp-- alguém pode estar editando - Inchar seu
.vimrc-- ele deixa de ser portatil entre servidores