Uma Lição de VIM #15.1: Plugins – Vundle

(Essa é a parte em que começamos a mexer ao redor do VIM.)

Vamos começar a ver como adicionar funcionalidades no VIM com plugins. E, para isso, vamos ver Vundle, que é um gerenciador de plugins.

A pergunta que você deveria estar se fazendo agora é “E por que usar o Vundle?”. Na verdade, esta pergunta tem duas respostas:

A primeira é: Apesar de ser extremamente fácil de adicionar um plugin no VIM — normalmente é uma questão de descompactar um arquivo dentro do diretório $HOME/.vim — a parte chata é manter os scripts atualizados (e ficar preso à um arquivo compactado) e removê-los depois, se você encher o saco de um.

A segunda é: Vundle não é o único gerenciador de plugins para VIM, mas consegue instalar plugins por conta própria (Pathogen requer que você baixe os plugins manualmente, assumindo depois o controle para manter atualizado); a desvantagem é que Vundle requer que os scripts tenham uma determinada estrutura de arquivos e diretórios, mas praticamente todos os scripts hoje utilizam esta estrutura.

Então vamos lá, instalar o Vundle:

Primeiro, você deve baixar o plugin em si. Para isso, você tem que ter o Git instalado e executar:

git clone https://github.com/gmarik/vundle.git ~/.vim/bundle/vundle

Simplesmente, você está copiando o repositório do vundle para um diretório do próprio VIM. Até aqui nenhuma surpresa, exceto que o diretório de plugins é $HOME/.vim/plugin (ou ~/.vim/plugin) e a colanagem colocou no diretório ~/.vim/bundle. Ou seja, o Vundle não está ativo como um plugin do VIM (ainda). O Vundle faz isso de propósito, para que os scripts instalados com o Vundle não se misturem com os plugins instalados manualmente.

A seguir, é preciso ativar o Vundle. Para isso, nós vamos adicionar o diretório do Vundle no path do VIM e chamar o script de inicialização. Para isto, adicione as seguintes linhas no seu vimrc:

set rtp+=~/.vim/bundle/vundle/
call vundle#rc()

Explicando: “rtp” é a forma curta de “runtimepath”, que identifica os diretórios onde o VIM irá procurar scripts, se preciso. No caso, estamos adicionando o diretório do Vundle, que clonamos anteriormente. A seguir é chamado o script de inicialização do Vundle.

Pronto! Agora o Vundle está instalado.

A questão é: E agora que o Vundle está instalado, “faz o que?”

O Vundle tem mais comandos disponíveis, entre eles :Bundle "{bundle}"[1]. Este comando adiciona um bundle/plugin/script na lista de bundles/plugins/scripts gerenciados pelo Vundle. A única coisa que esse comando faz é adicionar o bundle na lista; ele não vai instalar o bundle ainda, ele não vai remover o bundle, ele não vai atualizar o bundle. Apenas adicionar na lista.

O parâmetro do comando, {bundle} pode ser:

Uma vez que você tenha a lista de plugins que você quer no sistema, você pode instalar todos usando :BundleInstall; se quiser remover um plugin, você simplesmente o deixa fora da lista de plugins desejados e executa :BundleClean; e, para atualizar os plugins que estão instalados, :BundleUpdate.

Acho que você já percebeu que o problema de se manter uma lista de plugins manualmente é meio chato: Toda vez que você quiser verificar se há atualizações dos plugins, você tem que entrar a lista inteira; se você esquecer de um plugin e fizer :BundleClean irá remover esse plugin. Para evitar essa complicação, você pode adicionar os comandos Bundle diretamente no seu vimrc[2]. Assim, cada vez que você usar qualquer comando do Vundle, você não precisa se preocupar em lembrar de todos os plugins instalados.

E, como última dica, fica o seguinte: Logo após a linha do “call vundle#rc()”, adicione

Bundle 'gmarik/vundle'

.. que nada mais é que o repositório que fizemos o clone logo no começo; desta forma, quando você fizer um :BundleUpdate, o próprio Vundle poderá ser atualizado com a última versão disponível.

[1] Lembram que eu falei que plugins poderiam adicionar novos comandos e que estes teriam pelo menos a primeira letra em maiúsculas? Pois é…

[2] Lembre-se também que o vimrc é um arquivo executado em modo Ex e o modo Ex nada mais é que o modo de comando sem precisar colocar : na frente de cada comando.

My list of VIM Bundles

Not that anybody asked me, but I recently ditched Sublime Text 2 for VIM… again.

But here is the thing: I just ditched it ’cause I’m using a lot of bundles to change VIM default behaviour, adding more feature and that fuss. The ones I’m using:

Vundle
Vundle is the plugin I’m currenctly using to manage all the other plugins. Vundle is a really simple way to keep your other plugins up-to-date. All the other plugins listed here were installed using Vundle.

vundle

Powerline
Powerline changes the default “last status” line to provide a lot more information. The cool thing about Powerline is that it comes not only with a VIM plugin, but also with a Bash prompt and an iPython prompt, so everything have (almost) the same look.

powerline

Vim-Fugitive
I got Vim-Fugitive to display the current branch in the old Powerline plugin (the current one does that already). One of the things I still try to use is :Gstatus, which display the current changes in the index. The problem here is that the display, although pretty familiar, it’s a mess when you’re dealing with a single file (it shows “Changes not staged for commit” and then, when you add it to the index, it just change that to “Changes staged for commit”, which is pretty easy to miss in the list of things that are shown).

fugitive

Vim-Commentary
Vim-Commentary lets you comment a block of text pretty quickly, which is useful. The only issue with it is that it follows the current file type (as VIM does not have a “block type” or “region type” support), so trying to comment a few lines of JavaScript in an HTML file will produce HTML comments, not JavaScript/C++ comments. Still pretty useful to quickly comment that one line in your Python code.
Tabular
Tabular is a hard plugin to master, but really useful. With it, you can realign your code on custom characters (for example, align your variable definition on the “=” character). Or make all your HTML/XML properties align on “=”. And so on.
Auto Pairs
Auto-pairs does exactly what it says: It complete pairs of characters, adding a second " after your first ", the closing bracket and so on.
Vim-Flake8
On our Python project, we have a strictly “follow PEP8” policy. With Vim-Flake8, PEP8 errors are displayed in the error window for easy access (and fix).

flake8

SnipMate
SnipMate is a TextMate-like snippet plugin, but really easy to use. Type the snippet name, press [Tab] and it will complete the snippet, positioning the cursor on the marker areas.

snipmate

CtrlP
Again, a plugin inspired on TextMate/Sublime Text: Fuzzy file search. It allows faster file switching by doing fuzzy search on filenames and directories, to the point that I barely use the open command/dialog these days. Also, you can chose to open the file in the current buffer, new split window or new tab.

ctrlp

Vim Multiple Cursors
Again, a feature based on TextMate/Sublime Text: Selection of multiple elements and change in those selected. It is a more visual way of doing :s/<original>/<replacement>.

multiple-cursors

After seeing this, you’re probably asking yourself: But with all those features based on Sublime Text, why not use Sublime Text directly? Well, for one, I’m a fan of the VIM movement/selection way of doing things; second, I use “jump to mark” pretty often (including “jump to last changed area in this file” and “jump to the previous jump place”) and Sublime does not have that; third, I prefer the way VIM colorizes the code, even if I try to use the same colorscheme in both editors (the difference here is the syntax file, so…); fourth, even if Sublime have a Vintage mode, most of the things I use (like smart jumps) do not exists.

Also, some bugs in plugins/Sublime let me down from time to time: Ctrl+R, sometimes, start in visual mode when Vintage is on (in other words, as soon as you find the definition you’re looking for, you start selecting text); Flake8 for Sublime manages, from time to time, to move the cursor to focus nothing, so you’re forced to move your hand to the mouse and click on the text again to be able to do anything.