sexta-feira, 4 de abril de 2008

Vim, taglist e ctags: Programando com produtividade

Cof! Cof! Quanta poeira! Sim, eu sei. Já faz quase um mês que não escrevo. Mas tenho algumas boas descuplas: Fui contratado no LTC e muita coisa mudou: Rotina nova - acordar e chegar em casa em horários diferentes e aula na Unicamp. Computador novo - sim a Lisa se foi. Com a chegada do notebook da IBM a sempre presente Lisa deu lugar ao Maizena.

Bom, o fato é que já dentro da IBM entrei em um projeto majoritariamente em Python. Uns pedaços em shell script, mas a grande maioria em Python. O que me forçou a ser um pouco mais produtivo do que o normal. Com Vim e ferramentas adequadas isso é bastante fácil. :-)

Indo direto ao assunto, ao final deste breve tutorial, iremos ter algo parecido com o screenshot acima: Teremos uma lista de classes e métodos do projeto todo em uma janelinha (split) do Vim. A tela lateral é gerada com o plugin TagList e a lista de classes e métodos (as informações em si) é com o ctags. Tudo muito simples.

Primeiro vamos entender o programa ctags: Ele lê arquivos fonte (e até agora eu já testei com C e Python) e gera um arquivo de tags que contém informações relevantes tais como: Declaração de variáveis, declaração de funções (em caso de linguagem estruturada), classes e seus métodos (em caso de linguagem orientada a objeto) e por ai vai. As tags são orientadas ao caminho do arquivo de onde foram lidas as informações, isso quer dizer que gerar um arquivo de tagas com o caminho absoluto do arquivo é mais interessante do que gerar o mesmo arquivo com o caminho relativo já que vamos manipular informações dentro de um projeto inteiro. Trocando em miudos:

$ find $(pwd) -regex ".*py$" | xargs ctags

Execute este comando na raiz do projeto, ele irá ler todos os arquivos .py e irá mapeá-los com ctags gerando o arquivo tags. Note que o diretório de procura será $(pwd), isto fará com que as tags tenham o caminho absoluto do arquivo mapeado.

Agora, você terá que copiar o arquivo de tags para cada um dos diretórios do projeto:

$ find $(pwd) -type d -exec cp -v tags {} \;


(Quem tiver dúvidas no shell só deixar nas caixas de comentários que eu explico)

Depois de criar e copiar o arquivo de tags para cada diretório de seu projeto, agora é hora de usar TagList dentro do vim. Baixe o arquivo, descompacte e copie o arquivo taglist.vim para dentro de ~/.vim/plugin e taglist.txt para ~/.vim/doc:

$ cp taglist.vim ~/.vim/plugin
$ cp taglist.txt ~/.vim/doc


Agora é só correr pro abraço. O comando mais importante que você deve aprender agora é TlistOpen. Deve saber também que dentro do split você pode apertar F1 e receber ajuda sobre os comandos e keybinds que pode usar para navegar nas classes e métodos.

:TlistOpen

E agora, o mais legal de tudo: Com a split aberta (e com as classes e métodos do arquivo atual lá), você pode usar as keybinds do ctags para pular diretamente para métodos em outras classes e em outros arquivos. Por exemplo, com o cursor em cima de um método qualquer você pode apertar Ctrl+] e pular automaticamente para o arquivo onde está implementado o método. A split irá mostrar a classe em questão e seus métodos como mostra a figura abaixo:

Espero ter ajudado os programadores por ai! :-)

9 comentários:

Unknown disse...

A combinação do VIM com alguns plugins realmente ajudam e muito quando estamos programando. Teve um tempo em que eu usava ele pra programar em RoR e fui agregando alguns plugins nele. Ficou muito bom, com tudo acessível e bem direcionado a linguagem que eu estava trabalhando.

Unknown disse...

Uma coisa que não pude deixar de notar.... vc tá usando orientação a objetos??? =P

Eduardo Otubo disse...

Então,

Os screenshots são do projeto Bittorrent. Devido à confidencialidade da IBM eu não botar screenshots do meu projeto e tals... Mas *sim*, to programando orientado a objeto. Por incrível que pareça :-P

[]'s

Úrsula Junque disse...

Programar orientado a objeto em python eh quase uma consequencia natural :) E programar orientado a objeto é tãaaaao legaaaaaaaal :p

Sergio disse...

Conhece o plugin SnippetsEmu?
http://www.vim.org/scripts/script.php?script_id=1318

Um vídeo sobre o plugin:
http://ttyshare.com/rec/mopemope/3716682/

Eduardo Otubo disse...

voyeg3r,
Bem massa esse plugin, vou dar uma olhada nele e, quem sabe, ele também não ganha um review dele (misturado com outro plugin) aqui no otubo.net :-)

Valeu a dica!
[]'s

Sergio disse...

Iniciei um projeto para a criação de um livro sobre o vim em português: No meu
blog http://vivaotux.blogspot.com/2009/01/nosso-livro-sobre-o-vim.html
há uma postagem sobre e um previw em um frame do site scribd.

Há um grupo de discussão
http://groups.google.com/group/vimbook

e a página oficial do projeto
http://code.google.com/p/vimbook/

A idéia é que as pessoas que dominam melhor o vim e o Latex adicionem suas
melhores idéias a este projeto!

Sergio disse...

Estava lendo um comentário seu Otubo, sobre seu desejo de versionar arquivos de configuração de ambiente, veja estes links:

http://bitbucket.org/sergio/vimfiles

http://vimcasts.org/episodes/synchronizing-plugins-with-git-submodules-and-pathogen/

http://pyverted.com/version-control/using-mercurial-on-your-home-directory/2009/08/

Eduardo Otubo disse...

Caramba, que meméria voyeg3r! Vou averiguar as dicas. Muito obrigado :-)