IPython Debugger no Vim

Faz algum tempo que comecei a usar o Vim. Para quem não sabe o Vim é uma derivação do Vi. Ele é um clone bastante fiel, mas possui algumas funcionalidades a mais. Por curiosidade, o nome Vim surgiu como “Vi iMitator”, mas depois de um tempo as pessoas começaram a chamá-lo de “Vi iMproved”.

O Vim é um editor de texto bastante poderoso que possui diversos modos de utilização. Entre eles temos o modo visual, o de edição e o de linha de comando. Saber combinar esses diversos modos e as operações que eles viabilizam agilizou muito a minha maneira de escrever código.

Outra característica do Vim é a de ele ser bastante configurável de acordo com as suas preferências. Você pode personalizar desde configurações de fontes e cor até o uso de plugins. Existem vários exemplos de configurações e plugins na Internet como o NERDTree e o Darkspectrum. Para configurar o seu Vim da maneira que você prefere basta você editar o arquivo .vimrc que fica na sua home.

Em Python, para debugarmos o código existe o pdb e o ipdb. A diferença entre os dois é que o segundo, ao invés de abrir o console Python para debugar o código abre uma sessão no IPython para fazê-lo. Para criar um breakpoint no código, sempre temos que colocar a seguinte linha de código onde queremos parar:

import ipdb; idpb.set_trace()

Ficar repetindo isso 20000 vezes no código para debugar é um pé no saco. Então, resolvi criar um scrip para o Vim que fizesse isso para mim e poupasse meu tempo. Dei uma pesquisada no Google e achei um cara que já havia feito algo parecido, entretanto, o código estava bem estranho e eu não me permiti deixar aquele código no meu .vimrc. Peguei o código, refatorei e botei a função de remover breakpoints para funcionar, coisa que não acontecia antes. O resultado está nesse guist que está na minha conta do Github:

python << EOF
import vim
import re
ipdb_breakpoint = 'import ipdb; ipdb.set_trace()'
def set_breakpoint():
    breakpoint_line = int(vim.eval('line(".")')) - 1
    current_line = vim.current.line
    white_spaces = re.search('^(\s*)', current_line).group(1)
    vim.current.buffer.append(white_spaces + ipdb_breakpoint, breakpoint_line)
vim.command('map <C-I> :py set_breakpoint()<cr>')
def remove_breakpoints():
    op = 'g/^.*%s.*/d' % ipdb_breakpoint
    vim.command(op)
vim.command('map <C-P> :py remove_breakpoints()<cr>')
EOF

Foi bastante interessante porque não conhecia esse módulo do Python para escrever scripts para o Vim. Para usar esse script para usar o ipdb basta copiar o código e colar no seu .vimrc. A partir de então o comando Control + I insere um breakpoint na linha acima da linha correte e o comando Control + P limpa todos os breakpoints que estão no arquivo. Espero que seja de bom uso!

Share on Facebook
Post to Google Buzz

7 Comments

Francisco SouzaAugust 16th, 2010 at 10:29

Bacana demais Bernardo :)

Vou adaptar depois, por que eu já uso o atalho Ctrl+P.

Abraços o/

[...] This post was mentioned on Twitter by Francisco Souza, Bernardo Fontes. Bernardo Fontes said: Novo post no blog: IPython Debugger no Vim – http://bit.ly/ddahGK [...]

tarsis azevedoAugust 16th, 2010 at 10:40

Show de bola cara! ;D

Tu conhece algum livro manero pra aprender o vim?! ja uso a um tempo, mas só o basico! :P

Abraços

Diego DukãoAugust 16th, 2010 at 11:18

Foda, heim? Ainda não me aventurei no Vim, mas to vendo que vou acabar pendendo pra esse lado.

NubaAugust 16th, 2010 at 16:38

Ah garoto, largando a IDE e usando VIM!! Virando gente grande! ;) Quem quiser levar o modus operandi do vim pro browser, tem o http://vimperator.org/vimperator também que é muito foda!

HenriqueAugust 21st, 2010 at 18:59

Muito maneiro esse post!!
Estou usando vim a pouco tempo mais estou me amarrando.

[...] um tempo atrás e eu adaptei um plugin que achei na internet para o Vim cuja ideia é facilitar o uso do debugger do do P…. O que o plugin faz é mapear teclas para inserir ou remover uma linha que importa o módulo de [...]

Leave a comment

Your comment