Uma Lição de VIM #15.2: Plugins – Vim-Airline

(Essa é a parte em que o “laststatus” fica interessante.)

Quando estávamos falando de configurações, falamos de uma configuração chamada “laststatus”. Esta configuração tem 3 valores possíveis:

  • 0 – não apresenta a barra de status, nunca.
  • 1 – apresenta a barra de status se houver pelo menos um split.
  • 2 – sempre apresenta a barra de status.

E, conforme eu mostrei no meu arquivo de configuração, eu sempre deixo com “2”.

Acontece que a barra de status não é tããão informativa assim.

laststatus

Ela tem o básico, mas o básico não é o suficiente, sejamos honestos. É possível adicionar mais informações setando “statusline” (que eu não vou entrar em detalhes aqui, mas para configurar, você tem que usar letras únicas indicado para cada coisa que deseja apresentar tal como se faz com “guioptions”) mas, mesmo assim, certas coisas tem que vir de scripts externos (por exemplo, para mostrar o branch atual que você está) e, como eu falei, essa parte é meio chata.

Para aliviar essa confusão, existe um plugin chamado “Vim-Airline“, que tem uma apresentação mais complexa e oferece mais informações, baseados plugins que você tem instalado.

Ainda, o Airline é uma versão mais leve do Powerline, que na verdade passou de ser um simples plugin para VIM para ser um plugin para praticamente tudo (hoje eu uso o Powerline para configurar meu prompt do terminal, por exemplo) e algumas coisas ainda são usadas do Powerline (por exemplo, as fontes, mas esperem aí que eu já explico o porque o Airline usa fontes especiais.)

(Conforme formos passando a lista de plugins que eu tenho, vocês vão ver o Airline mudando de formato com o tempo.)

Como falei do Vundle como gerenciador de plugins, vamos usar o mesmo para instalar (e manter, no futuro) o Airline.

No seu vimrc, adicione o seguinte:

Bundle "bling/vim-airline"

E, revisando: :Bundle adiciona um plugin na lista de plugins gerenciados pelo Vundle (e apenas isso, nada mais); por ter uma barra no meio, estamos falando de um repositório do Github; para instalar o plugin, você precisa ou adicionar o plugin na lista manualmente (com o comando :Bundle) ou reiniciar o VIM caso você queria conferir se a configuração no seu vimrc está certa e fazer :BundleInstall.

Se nada apareceu, é porque o seu “laststatus” não está em “2”.

Se tudo deu certo, você verá o seguinte:

airline-nofonts

Não que tenha melhorado muito, mas agora você tem informações sobre qual o modo que você está atualmente (que vai mudar de cor conforme você passa para o modo de inserção ou visual), o nome do arquivo, o tipo de arquivo (que define qual a sintaxe está sendo usada), posição do cursor em relação ao todo do arquivo (em percentual) e a posição absoluta do mesmo (em linhas em colunas).

Ok, duas coisas: Ainda não é muito melhor (embora a parte de mostrar o modo ajude, acredite), mas temos alguns caracteres estranhos na barra.

É aí que entra a história do Powerline de novo: Os criadores do Powerline usaram “posições” não usadas nas fontes unicode para adicionar outros caracteres que são usados para melhorar a apresentação do status. Eles mantém um repositório com fontes já com os caracteres especiais e, caso a fonte que você queria não esteja na lista deles, eles tem um script para “patchear” a fonte desejada.

Uma vez que você tenha a fonte disponível no seu sistema, você deve adicionar no seu vimrc

let g:airline_powerline_fonts = 1

E o seu Airline, na próxima execução, deve ficar

airline-laststatus

Que é mais bonito, mas ainda continua mostrando as mesmas informações. Mais pra frente veremos ã integração com “Fugitive” (um plugin para VIM para Git) e o Syntastic (para validar o código com ferramentas externas) e como ambos são suportados pelo Airline, você terá todas as informações ao alcance do rodapé da janela.

airline-everything

Uma última nota: O Airline vem com suporte a temas, que você pode trocar usando :AirlineTheme (e um duplo [Tab] depois disso irá mostrar os temas instalados). Depois que escolher um, você pode definir

let g:airline_theme = ‘{nome do tema}’

no seu vimrc.

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.