Uma Lição de VIM #12.2: Meu .gvimrc

(Essa é a parte em que veremos mais do mesmo.)

Na parte de configurações, eu falei de dois arquivos, vimrc e gvimrc. Vocês já viram o que eu fiz com meu vimrc, então acho justo que vejam também o que eu fiz com o meu gvimrc.

Para que fique claro, vimrc sempre é lido, não importa qual executável do VIM você está usando. gvimrc é lido depois do vimrc somente quando você iniciar um VIM gráfico.

Como o arquivo é bem menor (já que o grosso da configuração fica no vimrc), este é o arquivo inteiro que eu estou usando:

 1 set guioptions=aegit    " basically, all options, except the scrollbar, menu and toolbar
 2 set columns=116         " number of columns (uses most of my screen, in this case)
 3 set cursorline          " highlight the line with the cursor
 4 set colorcolumn=+2      " put a marker at textwidth + 2
 5 set linespace=1         " spread the lines a bit, adding a 1px line above all
 6 
 7 if has(‘mac’)
 8     set gfn=monofur:h15     " My screen size sucks, mkay?
 9     set lines=63            " number of lines, based on my screen size and font
10 else
11     set gfn=monofur\ for\ Powerline\ 12
12     set lines=54
13 endif

E explicando:

  • set guioptions=aegit: Define a aparência do editor em modo gráfico. Eu prefiro um editor limpo, sem menus, toolbars ou (e isso talvez soe estranho para alguns), sem barra de rolagem. Em ordem, as opções ativas são:
    a
    Quando estiver fazendo a seleção com o modo visual, já copia o selecionado para a área de transferência. No caso de sistemas Unix, isso significa que selecionar algo com o modo visual é o mesmo que selecionar com o botão da esquerda (e que pode ser colado diretamente usando o botão do meio).
    e
    Mostra abas (se estiver configurado para mostrar abas com “showtabline” — que eu configurei para mostrar sempre no meu vimrc).
    g
    Mostra opções do menu desabilitadas. O normal é que opções desabilitadas sequer apareçam. Esta opção só faz sentido se o menu estiver presente (com a opção m no “guioptions”) que, como você pode perceber, eu não estou usando. Em alguns sistemas (por exemplo, OS X) o controle do menu não faz sentido porque o sistema operacional sempre tem um menu ativo. Assim, quando não há necessidade de menu, esta opção é desnecessária; quando não há escapatória do menu, pelo menos todas as opções serão visíveis.
    i
    VIM tem um ícone (sim você pode configurar para o que o VIM não mostre um ícone em lugar algum). De novo, dependendo do sistema operacional, esta opção não tem efeito algum porque o próprio sistema adiciona o ícone do launcher.
    t
    Menus podem ser arrancados (quando possível). Esta é uma funcionalidade que o GTK+ até a versão 2 tinha, que permitia que os menus fosse “desconectados” da área de menu, o que facilita bastante na hora de selecionar colorschemes (e como você pode adicionar um menu a qualquer hora com :set guioptions+=m, o que eu normalmente faço — ou melhor, fazia — era adicionar um grupo de novos colorschemes, ativar o menu, “arrancar” o menu de colorschemes e sair selecionando opções até achar um colorscheme interessante).
  • set columns=116: Número de colunas da janela do editor. Se a sua tela não tiver como apresentar 116 colunas (pelo tamanho da fonte e da tela, ou por alguma restrição do gerenciador de janelas), o VIM irá reduzir a quantidade de colunas até que a janela caiba completamente.
  • set cursorline: A linha onde o cursor se encontra tem highlight. E, caso você esteja se perguntando, existe um set cursorcolumn que mostra a coluna do cursor. Tanto “cursorline” quanto “cursorcolumn” funcionam em console, mas a forma como a linha é apresentada no meu colorscheme é… estranha.[1]
  • set colorcolumn=+2: Define uma coluna para ser marcada com uma cor diferente. Se for usado uma opção relacional (não um valor absoluto, mas algo começando com “+” ou “-“), então cursorline vai usar o “textwidth” atual.
  • set linespace=1: Define um espaçamento entre linhas, em pixeis. No caso, “1” significa que as linhas terão a altura requisitada pela fonte mais um pixel.
  • set lines=???: Define a quantidade de linhas do editor. Segue todas as considerações feitas em “columns”. Ainda, aqui eu estou usando de novo a checagem de funcionalidade (has()) para ter configurações diferenciadas no OS X e em outros sistemas operacionais.
  • set gfn=???: Define a fonte a ser usada (“gfn” é a forma curta de “guifont”). Note que fontes que tem espaço no meio tem que ter os espaços “escapados” (com \ antes do espaço) ou como strings. Se você quiser selecionar alguma fonte mas não faz idéia do nome da fonte, use :set gfn=* para que o VIM mostre o seletor de fontes do sistema; depois que escolher uma fonte, se quiser que o VIM descreva como usar, use :set gfn e cole o resultado no seu arquivo de configuração.

[1] E, lembrando mais uma vez: Para desligar opções deste tipo, coloque “no” na frente. Para desligar o highlight da linha atual do cursor, use :set nocursorline; para desligar o highlight da coluna atual do cursor, use :set nocursorcolumn.

Uma Lição de VIM #12: Arquivos de Configuração

(Essa é a parte em que eu menti.)

Lembram que bem no começo, quando estávamos falando dos modos de execução, eu comentei que o modo Ex não era usado?

Bom, eu menti. MUAHAHAHAHA!

muahaha

Na verdade, o Modo Ex não é chamado comumente, mas os arquivos de configuração do VIM são um grande amontoado de comandos executando em modo Ex.

E o que é o modo Ex, afinal de contas? O modo Ex nada mais é que o modo de comando sem a necessidade de usar : na frente de todos os comandos. Como ficaria complicado para, por exemplo, entrar no modo Ex, executar e arquivo, sair do modo ex e entrar em modo de inserção, até o momento temos usado o modo de comando para isso, já que economiza um monte de tecladas. Como não iremos ficar indo para o modo de inserção o tempo todo, e não faz sentido fazer um arquivo gigantesco com várias linhas começando com :, também faz sentido que o arquivo de configuração seja executado em modo Ex.

O VIM tem um arquivo de configuração global (conhecido com vimrc) e um arquivo para execução em modo gráfico (gvimrc)[1]. Ainda, existem duas versões de cada um destes arquivos: uma versão global para todos os usuários e uma versão definida para o usuário atual. Daqui pra frente, iremos ver as configurações do usuário, já que estas sobrepõem as globais.

vimrc e gvimrc ficam no diretório dos dados do usuário; em qualquer um dos sistemas operacionais hoje, você consegue descobrir o diretório destes arquivos com :echo $HOME dentro do próprio VIM. Apenas note que embora eu venho chamando os arquivos de vimrc e gvimrc, os nomes são, na verdade, .vimrc e .gvimrc (ou _vimrc e _gvimrc no caso do Windows).

Como existem muitas opções, não vou aqui explicar cada uma delas — mas, no próximo capítulo eu vou mostrar o arquivo que eu estou usando para servir de guia.

O que você vai ver quando abrir um arquivo de configuração:

set

set é, efetivamente, a forma de “setar” alguma configuração no VIM.

Existem dois tipos de configurações: As com valores e flags.

Flags é mais fácil de ser explicado: você simplesmente seta a configuração. Por exemplo, fazer com que o editor mostre uma coluna com o número de cada linha, você pode usar :set number (ou simplesmente set number dentro do arquivo de configuração). Para desligar uma opção deste tipo, você só precisa adicionar “no” na frente (para desligar number é usado :set nonumber).

“Valores” é exatamente o que significa: Ao invés de ser uma simples flag, a opção recebe uma string ou número. Por exemplo, :set tabstop=4 irá definir que o tamanho da tabulação é de 4 espaços. :set notabstop não tem efeito aqui, já que não é uma flag.

Para fazer com que uma configuração volte ao seu valor/estado original, use :set {opção}&; para verificar o valor de uma opção, use :set {opção}?.

Talvez a coisa não esteja muito clara aqui, mas quando examinarmos um arquivo de configuração real, as coisas irão clarear.

let

let é usado para definir o valor de uma variável. Uma variável tem sempre um valor — ou seja, não existem “variáveis flags”. Variáveis são normalmente utilizadas por plugins ou arquivos de sintaxe e, portanto, as variáveis que você terá que usar vão depender do que você está usando.

(Obviamente, se você estiver escrevendo seu próprio plugin — que eu não vou abordar aqui — o uso de variáveis vai ser praticamente obrigatório.)

if

if, como em qualquer linguagem de programação, serve para execução condicional. Você pode, por exemplo, verificar se alguma feature foi ativada na compilação do binário, se alguma opção está ligada, etc.

Por exemplo, para verificar se o suporte à scripts Python foi adicionado, você pode fazer:


if has('python')
" configuração em python vai aqui
end

Para verificar se alguma opção está ativa:


if &compatible
" configuração em modo de compatibilidade com o VI original
end

ou para conferir um valor:


if &t_Co > 2
" configuração quando há suporte a mais de 2 cores.
end

E assim por diante.

map, imap (e outros)

map pode ser usado para mapear teclas para outras funções. Por exemplo :map Y y$ irá mapear Y para executar y$ (copiar da posição atual do cursor até o fim da linha). Com excessão de [Shift], qualquer modificador pode ser usado:

  • C- para [Control]
  • M- para [Alt] (que normalmente é chamado de “Meta” em sistemas Unix — e por isso “M”)
  • O- para [Command] (somente em Macs)

Por exemplo, :map C-m yy irá adicionar [Ctrl]m para copiar a linha inteira.

Ainda, a diferença entre map e imap é que map é global enquanto que imap só irá funcionar em modo de inserção (e assim você pode imaginar o que nmap e vmap fazem, certo?)

au (ou autocmd)

Comandos que são executados em determinadas condições. Condições podem desde “FileType” para ações confirme o tipo de arquivo e “BufRead”, “BufWrite” e relacionados quando um buffer for aberto ou fechado.

O que seriam os “relacionados”? Bom, alem de ser na leitura/escrita do arquivo, podem ser adicionados comandos antes da execução (“BufReadPre”, “BufWritePre”), depois da execução (“BufReadPost”, “BufWritePost”) e durante (“BufReadCmd”, “BufWriteCmd”).

(Existem ainda auto-comandos para quando o editor entrar em modo de edição, abrir o VIM gráfico, VIM está fechando, e assim por diante. Para ver todos os eventos, digite :help autocmd-events.)

Por exemplo, au FileType smarty set ai para ligar a auto-identação quando VIM detectar que você está editando um arquivo Smarty (engine de templates para PHP). Ou ainda au BufRead set nocompatible irá configurar o editor para entrar em modo de não-compatibilidade com VI depois de abrir qualquer arquivo.

Ainda, é possível encadear auto-comandos, por exemplo, autocmd FileType python autocmd BufWritePre :%s/\s\+$//e irá fazer com que quando o tipo de arquivo for “python”, seja criado um auto-comando que antes de salvar o arquivo, seja executado um comando de substituição no buffer — que remove espaços em branco no final da linha).

(Se você está perdido com o que está vendo aqui, não se preocupe — a tendência é que, ao ver um arquivo de configuração real, você entenda o que está acontecendo).

[1] Existe um terceiro, .exrc, mas honestamente, em todo esse tempo usando o VIM, eu nunca tinha ouvido falar que este arquivo sequer existia.