Vim: pule para a origem da gema ao usar o Vagrant

No Vim, você pode usar tags para pular para a declaração da função (ou onde quiser). É como o recurso de “declaração Goto” em grandes IDEs (por exemplo, RubyMine). O problema é que quando você está usando o Vagrant, você não tem acesso às fontes de gems porque toda a configuração é feita dentro da caixa, mas você está executando o Vim fora dela. A solução que proponho é expor a pasta .rvm do sistema operacional convidado para o sistema operacional host.

Aqui, descrevi todo o processo, desde a criação de um diretório até a geração de tags para o projeto.

Presumo que você já saiba o que é ctags (leia este artigo se não for o caso).

1. Crie o diretório ~ / .vagrant_rvm no sistema operacional host

$ mkdir ~/.vagrant_rvm

2. Exponha a pasta .rvm do sistema operacional convidado para o sistema operacional host

Adicione esta linha ao Vagrantfile do seu projeto:

config.vm.synced_folder "/home/<username>/.vagrant_rvm", "/home/vagrant/.rvm"

3. Gere tags para o seu projeto de dentro do sistema operacional convidado

Instale ctags no sistema operacional convidado (todas as principais distribuições têm um pacote para ctags). Exemplo para Ubuntu:

$ sudo apt-get install exuberant-ctags 

Execute este comando (supondo que você esteja na raiz do projeto):

$ ctags -f gems.tags -R `bundle show --paths`

Em seguida, precisamos corrigir os caminhos para que apontem para /home/<username>/.vagrant_rvm(não /home/vagrant/.rvm):

$ sed -i 's/\/home\/vagrant\/\.rvm/\/home\/<username>\/\.vagrant_rvm/' gems.tags

4. Verifique se você tem isso em seu .vimrc

set tags+=gems.tags

Você também pode adicionar gems.tags ao .gititgnore-global.

5. Experimente!

Vá para qualquer método de gema e pressione Ctrl-].

PS Se você conhece uma solução melhor, fique à vontade para deixar um link nos comentários abaixo e irei deletar esse horrível conjunto de hacks 🙂

Bônus: se você estiver usando git, eu recomendaria configurar alguns git hooks , que irão (re) gerar ctags toda vez que você puxar, enviar commit ou rebase (graças a Tim Pope).