segunda-feira, 15 de junho de 2009

99 comandos do Vim que todo programador deveria saber

Antes de falarmos dos comandos, vamos a uma breve apresentação. O Vim é o sucessor mais difundido do vi, que é filho do ex com o ed, que por sua vez são filhos do qed, e por aí vai. O "vi" é a sigla de Visual Interface. Note que naquela época (início dos anos 80), não era comum como hoje, você ter um editor de textos visual, ou seja, você ver na tela o texto que está sendo editado. Tente imaginar como é editar um texto sem vê-lo. Quer tentar? Experimente o editor ed, presente em qualquer distribuição Linux.

Muito mais tarde, em 1992, apareceu no mundo Unix um concorrente do vi, o Vim (de "Vi IMitator", o imitador do vi) e logo se tornou popular, pois além de ser um clone muito bem feito do vi, possuía muitas outras funcionalidades, como uso da tecla TAB para completar nomes de arquivos, vários níveis de "undo" (desfazer comando), reconhecimento de sintaxe e histórico de linha de comando.

Então de "imitator" ele passou a ser chamado de "Vi IMproved", o vi melhorado. O Vim se tornou padrão em sistemas Linux, onde o /bin/vi é uma ligação simbólica para o /usr/vim, e conseqüentemente, a grande maioria usa Vim, mas acha que usa vi. Acabaram quase que virando sinônimos, mas, lembre-se, vi é diferente de Vim, e é sobre ele que este artigo comentará...



Apesar do Vim ser um editor de textos extremamente voltado para programação, ele também é poderoso para editar textos comuns (como esse) e possui muitas funcionalidades avançadas que outros editores gráficos como o Microsoft Word® têm, como abrir vários arquivos ao mesmo tempo, autocorreção, auto-identação, seleção visual, macros e outras que outro editor nem sonha ter, como seleção vertical de texto, interação total com o sistema operacional, uso de expressões regulares, sintaxe colorida, etc.

O Vim não é uma exclusividade de sistemas Unix, ele já foi portado para várias outras plataformas, como Amiga®, MacOs®, SunOs®, DOS®, Windows® e muitas outras. E como atrativo maior para os usuários novatos, também existe o gVim, para usar no X, com o mouse, menus, botões e todas as facilidades de uma aplicaçã o gráfica. Sendo o gVim apenas uma interface mais amigável do Vim, todas as funcionalidades deste funcionam naquele.

Vamos então para os comandos ...

100 Comandos do Vim que todo programador deveria saber

Busca

/palavra: Procura por "palavra" do início para o fim
?palavra: Procura por "palavra" do fim para o início
/Mari[oa]: Procura por "Mario" ou "Maria"
/\<pal: Procura por expressões que começem com "pala" como, "palavra" ou "palíndromo"
/ismo\>: Procura por expressões que terminem com "ismo" como, "autismo"
/\<para\>: Procura pela palavra "para"
/\<...\>: Procura por todas as palavras com 3 letras
/maria\|joao: Procura por maria ou joao
/\<\d\d\d\d\>: Procura exatamente por 4 dígitos numéricos
/^\n\{3}: Procura por três linhas em branco
:bufdo /palavra/: Procura "palavra" em todos os arquivos abertos

Substituição

:%s/antigo/novo/g: Substitui todas as ocorrências de "antigo" por "novo" no arquivo
:%s/antigo/novo/gw: Substitui todas as ocorrências com confirmação
:2,35s/antigo/novo/g: Substitui todas as ocorrências entre as linhas 2 e 35
:5,$s/antigo/novo/g: Substitui todas as ocorrências da linha 5 até EOF (fim da linha)
:%s/^/legal/g: Substitui o começo de cada linha com "legal"
:%s/$/Oh/g: Substitui o fim de cada linha por "Oh"
:%s/antigo/novo/gi: Substitui "antigo" por "novo" desconsiderando maíusculas e/ou minúsculas
:%s/ *$//g: Apaga todos os espaços em branco
:g/palavra/d: Apaga todas as linhas contendo "palavra"
:v/palavra/d: Apaga todas as linhas que não contém "palavra"
:s/maria/joao/: Substitui a primeira ocorrência de "maria" por "joao" na linha corrente
:s/maria/joao/g: Substitui todas as ocorrências de "maria" por "joao" na linha corrente
:%s/maria/joao/g: Substitui "maria" por "joao" em todo o arquivo
:%s/\r//g: Apaga retornos de carro do windows (\n)
:%s/\r/\r/g: Transforma os retornos de carro do windows (\n) em retornos do Linux (\r)
:%s#<[^>]\+>##g: Apaga tags HTML mas mantêm o texto
:%s/^\(.*\)\n\1$/\1/: Apaga linhas repetidas
Ctrl+a: Incrementa o número sob o cursor
Ctrl+x: Decrementa o número sob o cursor
ggVGg?: Muda o texto usando Rot13

Minúsculo/Maiúsculo

Vu: Torna todos os caracteres da linha minúsculos
VU: Torna todos os caracteres da linha maiúsculos
g~~: Inverte os caracteres do texto inteiro
vEU: Coloca as letras da palavra em maiúsculas
vE~~: Inverte os caracteres da palavra selecionada
ggguG: Coloca todo o texto em minúsculas
:set ignorecase: Ignora minúsculos/maiúsculos nas buscas
:set smartcase: Ignora minúsculos/maiúsculos em buscas exceto quando uma letra msiúscula é usada
:%s/\<./\u&/g: Coloca a primeira letra de cada palavra em maiúscula
:%s/\<./\l&/g: Coloca a primeira letra de cada palavra em minúscula
:%s/.*/\u&: Coloca a primeira letra de cada linha em maiúscula
:%s/.*/\l&: Coloca a primeira letra de cada linha em minúscula

Lendo/Gravando arquivos

:1,10 w arquivo: Salva as linhas de 1 a 10 em "arquivo"
:1,10 w >> arquivo: Adiciona as linhas de 1 a 10 em "Arquivo"
:r arquivo: Insere o conteúdo de "arquivo" no atual
:23r arquivo: Insere o conteúdo de "arquivo" a partir da linha 23

Explorando arquivos

:e .: Abre o gerenciador de arquivos integrado do Vim
:Sex: Divide a janela e abre o gerenciador de arquivos integrado
:browse e: Abre o gerenciador de arquivos integrado na janela corrente
:ls: Lista os buffers carregados
:cd ..: Move para a pasta superior
:args: Lista os arquivos
:args *.php: Abre lista de arquivos
:grep expressao *.php: retorna uma lista de arquivos .php que contenham a expressão informada
gf: Abre o arquivo sob o cursor

Interação com o Linux

:!pwd: Executa o comando "pwd" e retorna para o Vim
!!pwd: Executa o comando "pwd" e insere a saída no buffer
:sh: Retorna temporariamente para o shell
exit: Retorna para o Vim

Alinhamento

:%!fmt: Alinha todas as linhas
!}fmt: Alinha todas as linhas a partir da posição corrente
5!!fmt: Alinha as próximas 5 linhas

Abas

:tabnew: Cria uma nova aba
gt: Mostra a próxima aba
:tabfirst: Mostra a primeira aba
:tablast: Mostra a última aba
:tabm n(posicao): Reorganiza as abas
:tabdo %s/foo/bar/g: Executa um comando em todas as abas
:tab ball: Coloca todos os arquivos abertos em abas

Divisão da janela do Vim

:e arquivo: Edita "arquivo" na janela corrente
:split arquivo: Divide a janela e abre "arquivo"
ctrl-w "seta para cima": Coloca o cursor na janela do topo
ctrl-w ctrl-w: Coloca o cursor na próxima janela
ctrl-w_: Maximiza a janela corrente
ctrl-w=: Coloca todas as janelas com o mesmo tamanho
10 ctrl-w+: Adiciona 10 linhas de tamanho na janela corrente
:vsplit arquivo: Divide a janela verticalmente
:sview arquivo: O mesmo que split, mas em modo somente-leitura
:hide: Fecha a janela corrente
:only: Fecha todas as janelas, exceto a janela atual
:b 2: Abre #2 na janela corrente

Auto-completion do texto

Ctrl+n Ctrl+p (em modo de inserção): Completa palavra
Ctrl+x Ctrl+l: Completa linha
:set dictionary=dict: Define dict como o dicionário atual
Ctrl+x Ctrl+k: Completa usando o dicionário

Marcações

mk: Marca a posição corrente como k
‘k: Move o cursor para a marca k
d’k: Apaga tudo até a marca k

Abreviações

:ab email me@me.com: Define email como abreviação de me@me.com

Identação de Texto

:set autoindent: Liga a identação automática
:set smartindent: Liga a identação inteligente
:set shiftwidth=4: Define o tamanho da identação em 4 espaços
ctrl-t, ctrl-d: Identa/Deidenta no modo de inserção
>>: Identa
<<: Deidenta

Marcação de sintaxe

:syntax on: Liga a marcação de sintaxe
:syntax off: Desliga a marcação de sintaxe
:set syntax=perl: Força a usar a marcação de sintaxe do perl

Fontes:

Vim na Wikipédia: http://pt.wikipedia.org/wiki/Vim
Vim: Editor de Textos: http://aurelio.net/vim/
Texto sobre Vim e Emacs: http://aurelio.net/vim/vi-vim-venci.html
Tutorial do Vim: http://www.ademar.org/texts/vim.txt