English version
Rodrigo-header Rodrigo Rosenfeld Rosas

Produtividade com Vim como IDE

10/09/2010 20:00 (Atualizado em 16/02/2011 11:00)

Por muito tempo insisti em tentar utilizar IDEs como Netbeans, RubyMine, Eclipse e IntelliJ IDEA. Todas têm o mesmo problema: consumem muito recurso, são lentas e implementadas em Java (leia-se: você nunca sabe quando ocorrerá a próxima coleta de lixo e normalmente isto acontecerá no momento de maior inspiração)...

No último sábado minha irritação foi tanta que resolvi investir praticamente 3 dias completos do meu feriado estudando vários plugins para o Vim na tentativa de torná-lo um ambiente produtivo para desenvolvimento. O resultado foi satisfatório e resolvi escrever sobre como obter produtividade com Vim, resumindo os recursos interessantes que aprendi nesses 3 dias.

Caso você já seja usuário do Vim, recomendo que faça um backup dos seus arquivos de configuração caso deseje testar a configuração que descrevo a seguir.

O que esperar?

Os recursos que utilizava nos IDEs e que consegui utilizar no Vim foram:

Além desses recurso, conheci outros recursos que nunca cheguei a utilizar nos outros IDEs que utilizei. Seguem os detalhes.

Instalação

As instruções que descrevo foram as que utilizei com a distribuição do Linux que uso (Debian unstable) mas também deve funcionar com o Ubuntu e a maioria das distribuições Linux. No Windows, aparentemente a mudança é que o diretório de configuração do Vim chama-se "vimfiles" em vez de ".vim". Caso tenha alguma dúvida sobre o processo de instalação, é só postar um comentário.

Instale os pacotes necessários (como root, ou use "sudo" no Ubuntu):

1
2
3
4
5
6
7
8
9
10
11
apt-get install ruby-dev exuberant-ctags vim-gtk git
cd
git clone git://github.com/rosenfeld/vimfiles.git .vim
ln -s .vim/vimrc .vimrc
cd .vim
git submodule update --init
mkdir spell
wget -O ~/.vim/spell/pt.utf-8.spl http://github.com/rosenfeld/git-spell-pt-br/raw/master/pt.utf-8.spl
cd bundle/command-t/ruby/command-t
ruby extconf.rb
make

Algumas notas (para os curiosos ou quem tiver problema em executar os passos acima):

Após esses procedimentos, basta executar o Vim (sugiro utilizar o comando 'gvim' para evitar problemas com atalhos).

Recursos

O Vim tem muito mais recurso do que o que apresentarei. Para os que tem tempo disponível, recomendo a leitura de outros materiais a respeito.

Básico

Edição, gravação, navegação e saída do editor

Diferentemente de outros editores, o vim possui diferentes modos. Ele é iniciado no modo normal, aguardando uma sequência de caracteres que representem uma ação. Pressionando 'i' ou 'Insert', o vim entra no modo de inserção, a partir do qual é possível digitar qualquer coisa. Para sair do modo de inserção, basta pressionar 'Escape'.

Boa parte dos comandos são executados a partir de uma linha de comando que surge ao pressionar a tecla ':'. Alguns comandos corriqueiros são:

No modo de edição, é possível executar um comando digitando Ctrl+O e o atalho do comando no modo normal. Há várias formas de entrar no modo de edição, quando se está no modo normal:

Para excluir linhas, palavras e blocos, gerenciar cercas (surrounds) e inserir comentários:

Copiar e colar

No modo normal (não utilizar o ':'):

No modo visual, para copiar basta pressionar 'y' após selecionar o trecho, ou '"+y' / '"*y' para copiar para os registradores equivalentes às área de transferências comum e do mouse respectivamente.

Janelas e abas

Já comentei sobre alguns comandos básicos relacionados a abas. Seguem outros mais avançados:

Abertura rápida de arquivos

O atalho '<Ctrl+f><Ctrl+f>' (duplo Ctrl+F) ativa a busca rápida de arquivos para edição.

Dentro de um diretório do projeto em que você está trabalhando, o vim exibirá uma lista de arquivos que vai sendo filtrada na medida em que se digita partes do arquivo. Por exemplo, ao digitar 'a/c/uc', 'app/controllers/usuario_controller.rb' apareceria como uma possibilidade.

Selecionando com Enter, o arquivo será aberto na área atual. Pressionando Ctrl+t, o arquivo será aberto em uma nova aba.

Snippets (trechos de código)

Snippets são trechos de códigos expandidos ao se pressionar TAB. Por exemplo, div<TAB> está configurado para expandir para <div id="?">?</div>.

Para conhecer os snippets ou criar novos, verifique os diretórios snippets em ~/.vim/bundle/snipmate/snippets e ~/.vim/bundle/rosenfeld/snippets.

Os snippets são lidos automaticamente de bundle/*/snippets e ~/.vim/snippets.

Atalhos para se trabalhar com HTML, XML, ERB, ASP, JSP, PHP, GSP, etc

Atalhos para se trabalhar com HTML/XML também se aplicam a arquivos PHP, ASP, ERB, JSP, etc, desde que o tipo de arquivo seja algo do tipo "html.erb". Isto pode ser obtido com o comando :set ft=html.erb, para arquivos ERB. Para configurar estes tipos automaticamente de acordo com a extensão do arquivo, veja alguns exemplos em ~/.vim/filetype.vim.

Alguns atalhos para se trabalhar com HTML já foram citados, seguem alguns outros, para o modo de inserção:

Para arquivos de template, como ERB, JSP, PHP, etc:

Para ERB (Ruby), criei os seguintes snippets equivalentes:

Para escolher uma cor ao editar um arquivo CSS, com o kcolorchooser instalado (ver ~/.vim/initializers/kcolorchooser-mapping.vim para alterar programa de escolha de cor) pressione F12.

Correção ortográfica

Comandos:

Tags

Conheço duas formas de se trabalhar com tags no vim:

Plugin taglist

Comandos:

Suporte nativo do Vim integrado ao ctags

Deve-se criar um arquivo tags no diretório corrente (digite 'ctags --list-languages' para ver as linguagens suportadas):

1
ctags -R --languages=Ruby,Javascript

A partir daí, para pular para a definição de uma tag onde o cursor se encontra: - Ctrl+] ou Ctrl+<LeftMouse> ou g<LeftMouse>: pula para a definição na janela corrente - Ctrl+T ou Ctrl+<RightMouse> ou g<RightMouse>: Volta para a posição anterior ao pulo - Ctrl+w, ]: divide a janela horizontalmente e pula para a definição - g, Ctrl+] e Ctrl+w, g, ]: Apresentam uma lista de definições antes de pular se houverem múltiplas definições - ':tag NomeTag': Vai para a definição de 'NomeTag' - ':ts NomeTag': Abre uma lista de definições encontradas e lhe dá a opção de escolher uma - Ctrl+\: vai para a definição em uma nova aba

Indentação

Comandos:

Localizar e substituir

Comandos:

Marcadores

Comandos:

Listas de alterações

Comandos:

Navegação entre buffers

Comandos:

Navegação de arquivos em árvore

No navegador:

Comandos externos

Para executar um comando externo:

Integração com Git

Veja $VIMHOME/bundle/vcscommand/doc/vcscommand.txt para outros comandos. Por exemplo: - \cd: exibe as diferenças do arquivo corrente em uma nova divisão horizontal - \cr: exibe a última revisão do arquivo em uma nova divisão horizontal

Suponha que você queira saber quais são as diferenças entre suas mudanças não gravadas e o arquivo original: - \cr: exibe o arquivo original em uma nova divisão horizontal. Se você quiser que a divisão seja vertical, mova a janela para a esquerda (Ctrl+w, H) ou direita (Ctrl+w, L). H e L devem ser maiúsculas. - execute ':diffthis' em ambas as janelas: veja próximo tópico sobre as diferenças.

Você também pode dar uma olhada em $VIMHOME/bundle/fugitive/doc/fugitive.txt para mais atalhos para trabalhar com Git,como: - ':Gstatus': exibe a saída de 'git status' e permite-lhe adicionar ou remover o arquivo sob o cursor do próximo commit pressionando '-', ou ver as diferenças em uma janela vertical (pressionando 'D') ou em uma janela horizontal (pressionando 'dh'). - ':Gcommit', ':Gblame' and ':Gmove' são outros exemplos auto-explicativos. Dê uma olhada na documentação do fugitive para mais detalhes.

Visualizando as diferenças entre arquivos

Abra ao menos duas janelas com os textos que se quer comparar e digite ':diffthis' em ambas. Para desabilitar o recurso use o comando ':diffoff'. Utilize 'dp' em uma diferença destacada para por a versão corrente da diferença na outra janela ou 'do' para obter a diferença da outra janela. Use '[c' e ']c' para ir para a mudança anterior e próxima respectivamente. Veja ':h diff' para mais detalhes.

Consultando a ajuda do Vim

Específico sobre Ruby (Rspec, RDoc, etc)

Comandos:

Em projetos Rails (use tab para auto-completar a maioria dos comandos):

Depuração:

Você precisa instalar a gem 'ruby-debug-ide19' or 'ruby-debug-ide' para isto funcionar:

Refatoração

Embora Vim não lhe permita refatorar uma variável diretamente (ao menos, eu não sei como fazê-lo no Vim), ele pode ajudá-lo a refatorar seu código de diversos modos, usando comandos de substituição até extração de variáveis como no exemplo abaixo:

Suponha que você queira refatorar o código abaixo como segue:

1
2
3
  if User.find(params[:id]) and current_user.admin?
  # ...
  end

para:

1
2
3
  @user = User.find(params[:id])
  raise NotFoundException unless @user and current_user.admin?
  # ...

Para extrair a parte "User.find(params[:id])" para a variável "@user", você pode posicionar o cursor sobre o "U" e executar os comandos "c% @user" (alterar o conteúdo "User.find(params[:id])" com "@user"), "Ctrl+o, O" (executar o comando 'O' no modo de inserção [Ctrl+o] - criando uma linha acima da atual), digitando "@user = " e 'Ctrl+R "' (colando o conteúdo recortado anteriormente).

Com todas essas explicações, pode ter parecido complicado, mas veja como podemos alcançar o objetivo com apenas algumas combinações de teclas: c% @user <Ctrl+O>O @user = <Ctrl+R>".

Aprender a utilizar o Vim em sua expressão máxima permitir-lhe-á realizar várias tarefas mais rapidamente que qualquer outro editor ou IDE de um modo geral. Por exemplo, RubyMine permitir-lhe-á fazer o mesmo com provavelmente menos combinações para este caso específico, mas para casos especiais o Vim ainda lhe será bastante útil e não muito menos produtivo que o RubyMine para o caso comum. Na verdade, recortar "User.find(params[:id])" é muito mais rápido no Vim ("c%") do que selecionar o texto inteiro no RubyMine ou qualquer outra IDE. O mesmo se aplica para se alterar o conteúdo dentro de aspas, parênteses, tags XML, etc entre outros recursos.

O que não funciona?

Infelizmente, nem tudo são flores. Alguns recursos interessantes dos IDEs tradicionais ainda não consegui colocar para funcionar no Vim. Alguns exemplos incluem:

Mais por vir

Ainda há diversos outros comandos úteis como os de recolher/expandir (folding) e outros recursos interessantes que comentarei assim que tiver mais tempo disponível.

Já falei sobre vários comandos e sugiro que se comece tentando aprender aqueles que vocês mais utilizem, como Snippets, busca e substituição simples, abertura rápida de arquivos, uso de abas e navegação entre buffers. Para os que trabalham com HTML, também recomendo estudar os comandos do plugin "surround", que são especialmente úteis para trabalhar com tags.

Como uma última nota, este artigo foi escrito no Vim no formato Markdown. Muitos dos exemplos envolvem tags e para escapá-las no documento, utilizei o comando ':%HTMLSpecialChars' de um plugin incluído recentemente: htmlspecialchars.

Bom proveito!

comentários gerenciados por Disqus