garotosopa

Dicas para iniciantes no Vim

Publicado em Diversos por garotosopa em Janeiro 13, 2008

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.

  1. Modos no Vim
  2. Salvando e saindo
  3. Movimentando-se no texto
  4. Repetição de comandos
  5. Deletando
  6. Modo visual
  7. Desfazendo alterações
  8. Copiando
  9. Colando
  10. Registradores
  11. Buscar
  12. Substituir
  13. Abrindo arquivos em buffers
  14. Plugin Tabbar
  15. Dividindo a janela
  16. Configurações básicas
  17. 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.

Voltar ao índice

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

Voltar ao índice

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

Voltar ao índice

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)

Voltar ao índice

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

Voltar ao índice

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)

Voltar ao índice

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 :)

Voltar ao índice

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)

Voltar ao índice

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.

Voltar ao índice

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

Voltar ao índice

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.

Voltar ao índice

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.

Voltar ao índice

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)

Voltar ao índice

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.

Voltar ao índice

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

Voltar ao índice

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 :)

Voltar ao índice

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

Voltar ao índice

Etiquetado como:

2 Respostas

Subscreva aos comentários comRSS.

  1. Arthur Furlan said, on Fevereiro 10, 2008 at 4:02 pm

    Eu sempre deixo o meu arquivo de configuração do vim online[1] se quiser:

    $ wget http://arthurfurlan.org/dotfiles/vimrc.txt -O ~/.vimrc

  2. Sérgio Luiz Araújo Silva said, on Janeiro 6, 2009 at 11:08 am

    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


Deixe uma resposta