Configuração de Indentação no Vim - Tabs e Espaços

Republicação de Fernando Luis Basso

Introdução

Há duas maneiras de indentar um código fonte:

1. Com Tabs reais, também chamado de 'hard tabs'.
2. Com espaços no lugar de Tabs (sim, o Vim pode ser configurado para substituir uma tabulação por um certo número de espaços).

Há vantagens e desvantagens em cada um dos métodos. Há alguns artigos que discutem o assunto na Web, embora parece que mais pessoas preferem Espaços no lugar de Hard Tabs, mas isso é pura questão de gosto, e cada caso é um caso.

Basicamente, temos as opções:
  • 'tabstop': Altera a largura da tabulação (Tabs reais).
  • 'expandtab': Causa espaços serem usados/inseridos no lugar de caracteres Tab.
  • 'softtabstop': Configura detalhadamente a quantidade de espaço a serem inseridos quando a tecla Tab é pressionada.
  • 'shiftwidth': Afeta o uso de ">>", "<<", modo normal, "Ctrl-t" e "Ctrl-d" no Modo Insert, além de ter influência em como indentação automática funciona.

Para iniciar, execute isso no Vim:

:set list
:set listchars=tab:T_


A partir de agora, toda vez que o Vim "enxergar" um Tab real, ele vai mostrar algo como "T_____" no lugar do texto, para que o Tab fique visualmente percebível.

Pra desabilitar basta fazer:

:set nolist

Indentação com Hard Tabs Apenas

Por padrão, o Vim vem configurado com:

tabstop = 8
softtabstop = 0
shiftwidth = 8
noexpandtab


Independente de sua configuração, digite esta linha para testar (simplesmente coloque os valores default):

:set tabstop=8 softtabstop=0 shiftwidth=8 noexpandtab


O que acontece então?

1. Com esta configuração, pressionar a tecla Tab no modo 'Insert' insere um caractere Tab real, com largura de 8 colunas.
2. Neste caso, deletar o caractere Tab (deleta 8 colunas), o que visualmente parece que vários espaços foram deletados ao mesmo tempo.
3. No modo Normal, usar: >> e <> e <> e <> e <<, insere ou deleta 4 espaços. O mesmo ocorre ao se pressionar 'Ctrl-t' e 'Ctrl-d' no modo 'Insert'.

Espaços

Mas note o 'NOexpandtab':

:set tabstop=8 softtabstop=4 shiftwidth=4 noexpandtab


Agora, 'noexpandtab' não está habilitado, e portanto, pressionar insere um Tab real (e não espaços no lugar do Tab). Se pressionar Tab, e 'tab=8', um Tab terá largura de 8 colunas.

Como você sabe, ">>", "<>" duas vezes. Você vai notar que ele se transforma em um Tab real. Isso porque "tabstop=8" e "shiftwidth=4", então, 4 + 4 = 8. Se "tabstop=12", por exemplo, então pressionar ">>" 3 vezes se gera uma Tab real, porque 4 + 4 + 4 = 12.

Isto tudo acontece porque 'softtabstop' tem precedência sobre 'tabstop'. Então, quando pressionamos, por exemplo, "Ctrl-t" uma vez, ele insere 4 espaços, mas quando pressionamos "Ctrl-t" uma segunda vez, ele diz: "Hmm, isso está igual à "largura" do 'tabstop', e então os 8 espaços são deletados e um Tab real é inserido. Quando usamos , "Ctrl-d" ou "<<", o processo inverso ocorre.

Misturando

Vamos deixar 'tabstop' igual a 4, com 'expandtab' desabilitado:

:set tabstop=4 softtabstop=4 shiftwidth=4 noexpandtab


Agora, como 'tabstop' está igual 'shiftwidth' e 'expandtab', quando, ">>" ou "Ctrl-t" for pressionado, uma Tab real será inserida pois o Vim notou que as configurações estão iguais. Quando as configurações estão iguais.

Note que Tabs reais e espaços antigos no arquivo continuam sendo o que eram.

O que pode mudar é o tamanho das Tabs reais, mas não o fato de serem Tabs reais ou não. O que já era Tab real continua sendo Tab real, e o que era (grupos) de espaços continuam sendo (grupos) de espaços (grupos de espaços que por ventura tenham sido inseridos em lugar de Tabs reais).

Possíveis Escolhas

- Hard Tabs (Tabs Reais)

Quem prefere trabalhar com Tabs reais, uma boa escolha é deixar 'tabstop' igual 'shiftwidth', pois eles trabalharão de maneira consistente e homogênea. Espaços não serão usados.

- Espaços em vez de Tabs Reais

Deixar 'softtabstop' igual a 'shiftwidth', assegura que ">>", "<<", "Ctrl-t" e "Ctrl-d" adicionem e removam Tabs (não reais, pois agora é substituída por espaços) com o mesmo comportamento de se adicionar e deletar tabs pressionando a tecla 'e' . Ou seja, todos eles vão adicionar ou remover o mesmo número de espaços - irão funcionar de forma homogênea.

Pode-se também, neste caso (e alguns acham aconselhável), deixar 'tabstop' com o mesmo valor de 'shiftwidth' e 'softtabstop'.

Notas Finais

Saiba que o Vim permite configurar tudo isto de acordo com o 'filetype'. Por exemplo, é possível configurar que arquivos ".html" utilizem 2 espaços no lugar do Tab, um arquivo em "C" utilize 4 espaços no lugar de um Tab, e ainda, quando um arquivo Bash for editado, um Tab real de 6 colunas seja usado. Ou seja, quando o arquivo é aberto, o Vim usa as configurações predefinidas automaticamente.

Alguns exemplos

Vamos criar os diretórios necessários:

$ mkdir --parents ~/.vim/after/ftplugin/

Para HTML, criar o um arquivo chamado "html.vim" dentro do último diretório criado:

$ vim ~/.vim/after/ftplugin/html.vim

E coloque o seguinte conteúdo dentro do arquivo:

set softtabstop=2 expandtab shiftwidth=2


Para CSS, criar o arquivo "css.vim", no mesmo diretório que do exemplo anterior:

$ vim ~/.vim/after/ftplugin/css.vim

E cole o seguinte conteúdo:

set softtabstop=4 expandtab shiftwidth=4


Para "bash", com Hard Tabs:

$ vim ~/.vim/after/ftplugin/bash.vim

E cole:

set tabstop=6 softtabstop=6 shiftwidth=6 noexpandtab


Dica final

Se você optar por usar espaços no lugar de Tabs, há uma maneira de inserir Tabs reais sem ter que mudar temporariamente a configuração. Isto é conseguido inserindo-se caracteres não imprimíveis literalmente.

No Vim, isto é muito fácil. Basta pressionar "Ctrl-v" no modo 'Inserte', e então pressionar a tecla Tab em seguida.

- Passo a passo:
  • vim: Abre o Vim no terminal (poderia ser o gvim).
  • i: Entra no modo 'insert' na posição onde está o cursor.
  • Ctrl-v: Pressionar a combinação "Ctrl-v". Vai aparecer um caractere parecido com um "^". Neste momento, o Vim está esperando você digitar o caractere que termina a sequência, no nosso exemplo, um . Pressione Tab.
  • hello world: Escreva "hello world", por que este é um encantamento que garante que você aprenda o conteúdo. Sempre foi assim em todas as linguagens, e esta é a razão. São palavras mágicas.

Como mesmo exemplo, você poderia inserir um caractere ou literalmente no texto.

Aqui está o arquivo que fiz no Vim, mas convertido para ".html". Tive que renomear para ".pdf" para fazer o upload. Depois de baixar, troque a extensão para ".html" novamente e abra no seu navegador favorito. Está bem colorido, facilitando a leitura.

Referências

No Vim:
:help 'softtabstop'
:help 'tabstop'
:help 'shiftwidth'
:help 'expandtab'

Sites:

Previamente publicado em:

Comentários