Dicas para iniciantes no Vim
Já faz algum tempo que venho utilizando o Vim para programar e editar textos em geral, mas sempre que falo isso, muitos se assustam e acham um absurdo.
Provavelmente as pessoas acreditam que eu fico aqui com um machado ou uma enxada, suando para conseguir digitar em meio a todas aquelas letras esquisitas. Para acabar um pouco com essa lenda (ou confirmá-la de vez), tentarei sintetizar os comandos que mais uso.
Não que já não existam milhares de tutorais de Vim, mas enfim, essa é minha tentativa.
- Modos no Vim
- Salvando e saindo
- Movimentando-se no texto
- Repetição de comandos
- Deletando
- Modo visual
- Desfazendo alterações
- Copiando
- Colando
- Registradores
- Buscar
- Substituir
- Abrindo arquivos em buffers
- Plugin Tabbar
- Dividindo a janela
- Configurações básicas
- Links interessantes
Modos no Vim
A primeira coisa que é preciso entender é que o Vim é baseado em modos, e os principais são o Modo Normal, onde o que é digitado são comandos, e o Modo de Inserção, onde o que se digita realmente é o texto.
Ao entrar no Vim, você estará em Modo Normal. Para entrar em Modo de Inserção você pode utilizar:
i para inserir na posição atual, vem de insert
a para acrescentar à posição atual, vem de append
I para inserir no começo da linha
A para acrescentar ao final da linha
o para inserir na linha abaixo, já criando uma nova linha
O para inserir na linha acima, já criando uma nova linha
Uma vez em Modo de Inserção, você retorna ao Modo Normal pressionando Esc.
Salvando e saindo
:w para salvar as alterações (abreviação de :write)
:w arquivo para salvar as alterações no arquivo especificado
Observe que ao salvar as alterações em outro arquivo, o arquivo aberto continua sendo o mesmo, exceto se o arquivo ainda não estivesse salvo, passando a ser o arquivo especificado.
:q para sair do Vim (abreviação de :quit)
Se o arquivo foi alterado, o Vim irá alertar sobre as alterações não salvas. Se realmente for isso o que você quer fazer, precisará forçar a saída:
:q! força a saída sem salvar as alterações
:wq salva as alterações e sai
Movimentando-se no texto
A forma mais comum para movimentar o cursor ainda é as setinhas do teclado, utilize-as à vontade. Todavia, com o tempo você vai perceber que as setinhas ficam longe demais das letras e que você precisa movimentar todo o seu braço para alcançá-las. Para evitar este enorme esforço, tente o seguinte:
h esquerda
j baixo, sendo a tecla do seu indicador
k cima
l direita
Pessoalmente, ainda não me adaptei a estas teclas, principalmente porque não podemos utilizá-las em Modo de Inserção; mas em Modo Normal são realmente muito mais práticas.
Quando você está digitando uma linha longa e utiliza quebra de linha automática (wordwrap), ao movimentar para a linha de baixo você vai perceber que ele realmente vai para a próxima linha, e não para a posição abaixo do cursor. Para considerar o wordwrap, prefixe o movimento com a letra gê:
gk vai para a posição acima, considerando o wordwrap
g[setinha pra baixo] vai para a posição abaixo, considerando o wordwrap (não digite os colchetes)
g$ vai até o final da linha, considerando o wordwrap
Você também não viveria sem os seguintes atalhos:
^ volta ao começo da linha (provavelmente você terá que apertar duas vezes ou teclar espaço para que a tecla de fato apareça, já que se trata de um acento)
$ vai até o final da linha (esta e a anterior parecerão familiar pra quem conhece expressões regulares)
Para quem ainda está se adaptando, as teclas Home e End também funcionam.
w avança até a próxima palavra, vem de word
e avança até o fim da palavra atual
b retorna ao início da palavra
f[algum caractere] pressione efe seguido de algum caractere para posicionar o cursor na próxima ocorrência deste caractere (não digite os colchetes)
t[algum caractere] a mesma coisa para o tê, mas posiciona um caractere antes do caractere pressionado (não digite os colchetes)
gg retorna à primeira linha (tecle o gê duas vezes mesmo)
G vai até a última linha
:[número da linha] vai até a linha especificada (não digite os colchetes)
CTRL-o volta até onde você estava antes de pular de posição
Repetição de comandos
Para repetir um comando, simplesmente prefixe-o com o número de vezes que deseja repetí-lo. Exemplo:
3w avança três palavras
10k sobe dez linhas
2t” coloca o cursor antes da segunda aspas
3i[escreve e dá esc] o que você digitar será inserido três vezes (não digite os colchetes)
Deletando
Tão freqüente quanto a inserção de texto é a necessidade de apagar as besteiras que escrevemos. Enquanto estamos em Modo de Inserção, utilizamos o backspace e o delete para as correções triviais. Em Modo Normal, podemos fazer exclusões mais elaboradas, combinando o delete com os comandos que já vimos acima. Observe:
D apaga da posição atual até o fim da linha
dd apaga toda a linha
d[algum comando de posicionamento] combina o comando com qualquer outro comando de posicionamento, veja os exemplos abaixo
dw apaga até o fim da palavra
dt” apaga da posição atual até o fechamento das aspas
5db apaga cinco palavras para trás
CTRL-w em Modo de Inserção (diferente dos comandos acima em Modo Normal), funciona como o backspace, mas apaga até o começo da palavra (seria o mesmo que db em modo normal)
dit apaga o conteúdo da tag HTML/XML de onde está o cursor
Modo visual
Em um editor bobo, selecionamos parte do texto com o mouse ou segurando a tecla shift. No Vim utilizamos o Modo Visual, com a tecla vê seguida de algum comando de movimentação:
v inicia ou termina o Modo Visual, utilize por exemplo as setinhas para marcar o texto
vw inicia o Movo Visual e marca a próxima palavra
v$ inicia o Movo Visual e marca até o fim da linha
vwu marca a palavra e utiliza o comando u para deixá-la em minúsculo
vwU a mesma coisa para deixá-la em maiúsculo (e claro, é possível utilizar o u e U em qualquer tipo de seleção)
V inicia o Modo Visual, mas para toda a linha
ggVG volta até o início do arquivo (gg), inicia o Modo Visual de Linhas (V) e seleciona até o final do arquivo (G)
Desfazendo alterações
Pior que errar, é errar estragando o que estava bom. Lembre-se dos comandos:
u desfazer, vem de undo
CTRL-r refazer, vem de redo, mas pode vir de refazer mesmo :)
Copiando
Para copiar um texto no Vim você pode utilizar a seleção seguida do comando de cópia, ou utilizar a cópia combinada a algum comando de movimentação:
yy copia toda a linha (o y vem do termo yank, algo como arrancar em português)
yw copia até o fim da palavra
y2j copia mais duas linhas abaixo
v[faz alguma seleção]y copia a seleção realizada (não digite os colchetes)
Colando
p cola a partir da posição atual (o primeiro caractere colado fica após o cursor)
P cola na posição atual (o primeiro caractere colado fica onde está o cursor)
Em casos onde toda uma linha foi copiada, o pê minúsculo cola abaixo e o maiúsculo acima.
Registradores
Os acostumados em CTRL-C e CTRL-V perceberão que os métodos acima não permitem a troca de conteúdo com outros programas. Isso acontece porque ao copiar o texto com y, o conteúdo é colocado em um registrador anônimo, disponível somente no Vim.
Para especificar o registrador onde você deseja disponibilizar o conteúdo copiado, prefixe o comando com aspas duplas seguido do registrador:
“myy copia toda a linha no registrador eme
“jye copia até o fim da palavra no registrador jota
:registers lista o conteúdo dos registradores
Este recurso lhe dá a flexibilidade de ter diversos itens copiados simultaneamente (apesar de, sinceramente, eu nunca ter utilizado pra isso).
Além das cópias explícitas com y, os registradores também são usados obscuramente pelo próprio Vim. Quando você deleta um texto, ele vai para o registrador anônimo (podendo funcionar como um recurso de Recortar); o registrador 0 tem o último texto copiado; de 1 a 9 ficam os textos deletados (1 o mais recente, 9 o mais antigo); e no registrador - (sinal de menos, fazendo referência a algo pequeno) ficam os textos de menos de uma linha que tenham sido deletados. A exceção é o underscore, que não coloca o conteúdo em nenhum registrador.
“_dd desta forma a linha deletada não vai para nenhum registrador
Entendido mais ou menos o conceito, basta conhecer o registrador que utiliza a área de transferência:
“+yy copia toda a linha na área de transferência (o sinal de mais deve ser digitado mesmo, ele é o registrador)
ggVG”+y vai até o início do arquivo (gg), inicia o Modo Visual de Linhas (V), vai até a última linha (G) e copia para a área de transferência (”+y)
Para colar é a mesma coisa, basta especificar de qual registrador:
“+P cola da área de transferência (o sinal de mais deve ser digitado)
5″mp cola do registrador eme cinco vezes
Buscar
A parte de busca é bastante simples:
/digite o termo busca o termo digitado
n localiza a próxima ocorrência
N localiza a ocorrência na direção contrária
:set hlsearch destaca todos os termos encontrados (highlight)
:set nohlsearch como tantas outras opções do Vim, o prefixo “no” desabilita a funcionalidade
Para ignorar a diferença entra maiúsculas e minúsculas, basta incluir \c no termo da busca:
/\cdigite o termo realiza uma busca case insensitive do termo digitado
:set ignorecase configura todas as buscas como case insensitive
/\Cdigite o termo o cê maiúsculo força a diferenciação de maiúsculas e minúsculas
Pode parecer óbvio para alguns, mas não custa deixar claro: é possível utilizar expressões regulares como padrão de busca.
Substituir
A substituição de termos segue basicamente o padrão de expressões regulares, no formato s/antes/depois/. Ao substituir um termo por outro no Vim, precisamos ainda especificar onde a alteração deve ser realizada; para alterar um termo em todo documento, utilizamos o simbolo de porcentagem:
:%s/antes/depois/ substitui os termos localizados em todas as linhas
Os primeiros dois pontos iniciam um comando e o símbolo de porcentagem especifica onde a busca deverá ocorrer (nesse caso, em todo o documento). A barra funciona apenas como delimitador, o que é comum para quem está familiarizado com expressões regulares.
Caso o termo localizado apareça mais de uma vez na mesma linha, somente a primeira ocorrência é substituída, sendo necessário o uso da flag de Global Matching:
:%s/antes/depois/g com a letra gê no final, especificamos a flag necessária para alterarmos todas as ocorrências do termo em todas as linhas do documento
Da mesma forma que utilizamos a porcentagem para abranger todo o documento, podemos especificar intervalos de linhas:
:1,10s/antes/depois/g altera todas as ocorrências entre as linhas 1 e 10
Nesses casos eu prefiro primeiro realizar a seleção com Modo Visual de Linhas e em seguida aplicar a seleção. Tente o seguinte:
Vkkk:s/antes/depois/g iniciamos o Modo Visual de Linhas (V), subimos três linhas (kkk), começamos um comando (:) e realizamos a substituição (s/antes/depois/g)
As substiuições também suportam metacaracteres de expressões regulares, inclusive backreferences para recuperar o que foi casado em um grupo. Este assunto é um tanto quanto longo e merece melhor atenção em algum post futuro ou lendo o próprio manual.
Abrindo arquivos em Buffers
Uma vez dentro do Vim, você pode carregar outros arquivos no que é chamado de Buffer.
:edit arquivo carrega o arquivo especificado em outro buffer
:e arquivo por comodidade, basta utilizar a abreviação
gf abre o arquivo especificado no texto onde está o cursor, como em um argumento para include ou require no PHP, por exemplo
Com diversos arquivos abertos, você pode trocar de buffer utilizando os atalhos ALT-[número]. Aconteceu comigo do Xfce-Terminal já utilizar o atalho ALT-1 para trocar de abas, impedindo que o comando chegasse até o Vim. Como eu não utilizo abas no terminal, simplesmente desabilitei o atalho nas opções do Xfce-Terminal.
:buffers lista os buffers abertos, indicando o número do buffer e o caminho do arquivo
:ls sinônimo para listar os buffers abertos
:buffer [número] troca para o buffer do número especificado (não digite os colchetes)
Como lembrar os números é impraticável, você pode digitar parte do nome do arquivo (o suficiente para que ele seja o único encontrado). Vamos supor que você esteja com os arquivos consulta.php e consulta.tpl abertos em seus respectivos buffers:
:b php para abrir o buffer do arquivo consulta.php (abreviação de :buffer)
:b tpl para abrir o buffer do arquivo consulta.tpl
O acionamento dos buffers não está relacionado às extensão dos arquivos, apenas ao fato do padrão digitado identificar unicamente cada buffer. Imagine agora os arquivos Conexao.inc.php e Alunos.inc.php:
:b Con para abrir o buffer do arquivo Conexao.inc.php
:b Alu para abrir o buffer do arquivo Alunos.inc.php
Os termos “Con” e “Alu” já foram suficientes para identificar o buffer desejado.
Se ao invés de um arquivo você especificar um diretório para o comando :edit, o Vim abrirá uma lista de arquivos e diretórios para que você possa navegar e localizar o arquivo desejado. Utilize a tecla Enter para abrir o arquivo.
:bd para fechar o buffer (abreviação de :bdelete)
:bd [número] para fechar o buffer especificado (não utilize os colchetes)
Plugin Tabbar
Mesmo com o recurso de ativar o buffer especificando parte do nome do arquivo, ficamos sem uma indicação visível de quais arquivos estão abertos e como chegar facilmente até eles. Ficamos nada! O grande diferencial do Vim é a capacidade de estendê-lo, e na altura do campeonato, a quantidade de pessoas que já o fizeram.
Para facilitar a manipulação de buffers, utilizo o plugin Tabbar. Basta salvá-lo na pasta de plugins (~/.vim/plugin) que aparecerá uma barra no topo do editor, mostrando em abas os buffers abertos. Se estiver utilizando a versão gráfica GVim, poderá inclusive clicar nas abas, ou continuar utilizando o atalho ALT-[número]. O arquivo ativo na tela é identificado com um asterísco.
Dividindo a janela
Minha paciência já se esgotou faz tempo, mas não vale falar de Vim sem poder dividir o editor e visualizar mais de um arquivo simultaneamemte:
:split divide a janela na horizontal
:vsplit divide a janela na vertical
:split arquivo abre o arquivo após dividir a janela horizontalmente (o mesmo para :vsplit na vertical)
CTRL-w[movimento] para focar outra janela; o movimento significa as setas direcionais ou uma das teclas hjkl (não digite os colchetes)
CTRL-w q para fechar a janela atual (o arquivo continua aberto no buffer)
CTRL-w = configura as janelas com o mesmo tamanho (se estiver utilizando o plugin Tabbar, terá um resultado estranho, já que as abas têm sua própria janela)
CTRL-w - diminui o tamanho da janela focada
CTRL-w + aumenta o tamanho da janela focada
Configurações básicas
Finalizando, um breve comentário sobre as configurações que uso:
:colorscheme slate troca o esquema de cores para um de fundo escuro (especialmente agradável na versão gráfica)
:syntax on habilita o highlight de sintaxe, praticamente a única coisa que eu utilizava para programar em outras IDEs mais completas
:set tabstop=4 configura a largura visível de tabulações com \t
:set expandtab utiliza espaços ao invés de \t para tabulação
:set shiftwidth=4 configura o número de espaços na tabulação
:set smarttab habilita facilidades na tabulação, útil para mim ao dar backspace para remover tabulações com espaço
:set number mostra o número das linhas
As configurações são relativas à execução do Vim, algumas individuais por buffer. Para não ter que refazer as configurações toda vez que abrir o Vim, basta colocá-las no arquivo ~/.vimrc. No arquivo, não é necessário colocar os dois pontos a cada comando.
Por muito tempo utilizei o GVim, versão gráfica do Vim, e mantinha algumas configurações extras pra ele no ~/.gvimrc:
:set guioptions-=m para remover a barra de menu
:set guioptions-=T para remover a barra de ferramentas
:set guifont=Monospace\ 8 porque a fonte padrão é enorme!
Atualmente tenho usado o Vim no terminal mesmo, para poder desfrutar de um fundo transparente ou com alguma imagem legal :)
Links interessantes
- Documentação do Vim – também acessível pelo comando :help, ou :help comando para ajuda sobre um comando específico
- Plugin Tabbar – adiciona abas para os buffers abertos
- Vim for (PHP) Programmers – apresentação de Andrei Zmievski com dicas para uma boa utilização do Vim para programar PHP




Eu sempre deixo o meu arquivo de configuração do vim online[1] se quiser:
$ wget http://arthurfurlan.org/dotfiles/vimrc.txt -O ~/.vimrc
Você toparia participar do projeto vimbook?
http://code.google.com/p/vimbook/
No meu blog você pode ver uma breve descrição do projeto e acessar a versão atual
http://vivaotux.blogspot.com/2009/01/nosso-livro-sobre-o-vim.html
A idéia basicamente é a seguinte: Um livro com bom layout (compilado no LaTeX)
feito de forma colaborativa e mantido sob controle de versões, tem até um grupo para acompanhar as discussões sobre os rumos do projeto:
http://groups.google.com.br/group/vimbook