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: