Alterando o comportamento de indentação do Vim por tipo de arquivo

379

Alguém poderia me explicar em termos simples a maneira mais fácil de alterar o comportamento de indentação do Vim com base no tipo de arquivo? Por exemplo, se eu abrir um arquivo Python, ele deve recuar com 2 espaços, mas se eu abrir um script do Powershell, ele deverá usar 4 espaços.

EBGreen
fonte
9
A convenção BTW - PEP8 para Python diz que o tabstop deve ter 4 espaços e as tabs devem ter 4 espaços. ref: stackoverflow.com/questions/120926/…
cgseller

Respostas:

304

Você pode adicionar .vimarquivos a serem executados sempre que o vim alternar para um tipo de arquivo específico.

Por exemplo, eu tenho um arquivo ~/.vim/after/ftplugin/html.vim com este conteúdo:

setlocal shiftwidth=2
setlocal tabstop=2

O que faz com que o vim use guias com largura de 2 caracteres para recuar (a noexpandtabopção é definida globalmente em outros lugares da minha configuração).

Isso é descrito aqui: http://vimdoc.sourceforge.net/htmldoc/usr_05.html#05.4 , role para baixo até a seção plugins de tipos de arquivos.

SpoonMeiser
fonte
229
Você deve colocar isso em seu ~/.vim/after/ftplugin/html.vimlugar. Mas, como outros indicaram abaixo, é muito melhor adicionar apenas autocmd FileType html setlocal shiftwidth=2 tabstop=2ao seu .vimrc.
Aristóteles Pagaltzis 02/10/08
10
Opa, na verdade, é esse / é / onde eu tenho esse arquivo. Eu vou consertar a resposta. Mas eu discordo, acho que separar comandos para diferentes tipos de arquivos em arquivos separados facilita tudo, especialmente se você tiver requisitos para muitos tipos de arquivos ou muitas opções para alguns tipos de arquivos.
SpoonMeiser 03/10/08
3
Na verdade, não há muitas razões para usar o diretório after para ftplugins. O Vim carregará todos eles encontrados em seu caminho de execução, não apenas o primeiro para arquivos de sintaxe.
graywh
36
FYI: não use js para o tipo de arquivo javascript. Use javascript. ( autocmd FileType javascript setlocal shiftwidth=2 tabstop=2)
Kiddo 29/07
13
Você precisa adicionar filetype plugin onao seu vimrc também.
gatoatigrado 24/01
191

Use ftplugins ou comandos automáticos para definir opções.

ftplugin

No ~/.vim/ftplugin/python.vim:

setlocal shiftwidth=2 softtabstop=2 expandtab

E não se esqueça de ativá-los ~/.vimrc:

filetype plugin indent on

( :h ftpluginpara mais informações)

autocommand

Em ~/.vimrc:

autocmd FileType python setlocal shiftwidth=2 softtabstop=2 expandtab

Você pode substituir qualquer um dos comandos longos ou configurações com suas versões curtas:
autocmd: au
setlocal: setl
shiftwidth: sw
tabstop: ts
softtabstop: sts
expandtab:et

Eu também sugeriria aprender a diferença entre tabstope softtabstop. Muita gente não conhece softtabstop.

graywh
fonte
11
Obrigado! Também obrigado por esse pouco sobre 'ts' e 'sts'. Você recomenda alguma página em particular que discuta essa diferença e como usá-la?
Jvriesem
11
@jvriesem Não há muito: 'ts' é como os caracteres de tabulação são exibidos; 'sts' é quantos "espaços" inserir quando a tecla tab é pressionada; 'sw' é quantos "espaços" usar por nível de recuo; 'et' é se deve usar espaços ou tabulações; 'sta' permite inserir 'sw' "espaços" ao pressionar tab no início de uma linha.
graywh
10
Eu me pergunto se seria melhor usar as formas completas, para maior clareza, do que a frase curta no final.
icedwater
23
swé curto softwidth, stsé curto softtabstop, eté curto expandtab, setlé curto setlocale aué curto autocmd. Você pode usar os formulários longos em vez dos curtos.
Flimm
13
Eu acredito que se swexpande para shiftwidthe não softwidth.
johncip
83

edite seu ~/.vimrce adicione tipos de arquivos diferentes para diferentes recuos, por exemplo, quero html/rbrecuo por 2 espaços e js/coffeearquivos recuo por 4 espaços:

" by default, the indent is 2 spaces. 
set shiftwidth=2
set softtabstop=2
set tabstop=2

" for html/rb files, 2 spaces
autocmd Filetype html setlocal ts=2 sw=2 expandtab
autocmd Filetype ruby setlocal ts=2 sw=2 expandtab

" for js/coffee/jade files, 4 spaces
autocmd Filetype javascript setlocal ts=4 sw=4 sts=0 expandtab
autocmd Filetype coffeescript setlocal ts=4 sw=4 sts=0 expandtab
autocmd Filetype jade setlocal ts=4 sw=4 sts=0 expandtab

consulte: Configurando as preferências de espaço em branco do Vim por tipo de arquivo

Siwei Shen 申思维
fonte
Comentário a vimrc é única ":)
sdkks
@sdkks Acho que não. aspas duplas é comentário, aspas simples 'dão erro em todo o vim do meu Linux. (7.3+, 8.0 ...)
Siwei Shen 申思维
Sim. Meu comentário diz que use um único ", ou seja, não o feche com outro ". Não sei por que comentei isso.
Sdkks 6/03/19
ok, eu te entendi mal. I embora os meios de aspas simples ', mas não deixou "sem direito " @ @.
Siwei Shen申思维
60

Coloque os comandos autocmd com base no sufixo do arquivo em seu ~ / .vimrc

autocmd BufRead,BufNewFile   *.c,*.h,*.java set noic cin noexpandtab
autocmd BufRead,BufNewFile   *.pl syntax on

Os comandos que você está procurando provavelmente são ts = e sw =

Paul Tomblin
fonte
18
Qual é a vantagem disso FileType?
Casey Chow
3
Existe alguma maneira de inverter a partida?
SystemParadox
7
Ocorreu um problema ao fazer com que tipos de arquivos funcionassem com arquivos html (já que o arquivo .html não é realmente HTML, mas um arquivo HTML de modelo com uma linguagem de modelo). Os tipos de arquivos não parecem reconhecê-lo como html, mas esse método o fará.
Mark Hildreth
3
@digitxp - a vantagem é quando sua extensão usada não corresponde a um "FileType" definido. Por exemplo, na minha instalação, * .md significa um tipo de arquivo do Modula2 enquanto eu o uso para descontos. Eu poderia (a) alterar as configurações padrão do FileType (b) alterar as configurações do tipo de arquivo com uma configuração personalizada ou (c) obter rapidamente o que quero usando essa configuração no meu arquivo .vimrc 1 que eu acompanhei (c).
Pdwalker
Vale ressaltar que - supondo que minha leitura rápida dos documentos esteja correta - você pode adicionar vários comandos por tipo (s) de arquivos dessa maneira, e eles garantem a execução na ordem indicada.
Underscore_d
23

Eu costumo trabalhar com expandtabset, mas isso é ruim para makefiles. Eu adicionei recentemente:

:autocmd FileType make set noexpandtab

até o final do meu arquivo .vimrc e reconhece Makefile, makefile e * .mk como makefiles e não expande as guias. Presumivelmente, você pode estender isso.

Jonathan Leffler
fonte
A melhor opção é ativar: plugins de tipo de arquivo. O padrão do Vim inclui: setl noet, para que você nem precise desse aucmd no seu vimrc.
graywh
ESTÁ BEM. Você pode explicar os benefícios disso e o que está envolvido nisso? Por que os plugins de tipo de arquivo são melhores que o autocmd? Quando o autocmd deve ser usado? Não usado?
6139 Jonathan Leffler
5
Os plugins de tipo de arquivo que acompanham o Vim farão coisas úteis como "setlocal noexpandtab" para makefiles, por exemplo. Autocommands vs ftplugins para coisas pessoais como shiftwidth não importam - é exatamente como você escolhe estruturar sua configuração do vim.
graywh
17

Pessoalmente, eu uso essas configurações em .vimrc:

autocmd FileType python set tabstop=8|set shiftwidth=2|set expandtab
autocmd FileType ruby set tabstop=8|set shiftwidth=2|set expandtab
Nello
fonte
22
Muitos idiomas há muito estabelecem convenções, assim como certas empresas. Tome o NodeJS como um exemplo do primeiro. As guias devem ter dois espaços. Dor de cabeça e muito bobo, mas importante.
Paul Hazen
3
Por que as guias devem ser iguais para todas as circunstâncias? Para um arquivo de configuração, 8 guias de espaço funcionam bem, mas para códigos com muitos recuos, 2 é muito mais fácil de gerenciar. E existem convenções fixas: o node.js deve ter duas guias de espaço e o python é sintaticamente inválido com qualquer outra coisa além de quatro guias de espaço.
Felixphew
11
@felixphew Python está perfeitamente correto com qualquer número de espaços (ou até tabs), desde que permaneça o mesmo durante todo o tempo.
James
@DJMcMayhem Você está certo - eu deveria ter dito "recomenda fortemente".
Felixphew 31/03
11
+1 a Nello. O caractere de tabulação tem uma longa tradição de significar um salto para a próxima posição em um múltiplo de 8 caracteres. É apenas porque as pessoas queriam usar tab para "o próximo travessão que fica bem no meu idioma" e porque alguns editores de texto não se incomodaram em fazer a diferença entre "adicionar um caractere de tabulação" e "adicionar espaços para indentação" e as pessoas aprimorou o editor para fazer do seu jeito, que agora temos essa bagunça onde as guias nunca exibem o caminho pretendido. O código-fonte é texto e o padrão para o texto são guias de 8 caracteres.
Florian F
6

Isso pode ser conhecido pela maioria de nós, mas mesmo assim (fiquei intrigado na primeira vez): Fazer :set et( :setexpandtabs) não altera as guias já existentes no arquivo, é preciso fazer :retab. Por exemplo:

:set et
:retab

e as guias no arquivo são substituídas por espaços suficientes. Para ter as guias de volta, basta:

:set noet
:retab
Juan Lanus
fonte
4

Hoje, você pode tentar o editorconfig , também há um plugin vim para o . Com isso, você pode não apenas alterar o tamanho do recuo no vim, mas em muitos outros editores, manter estilos de codificação consistentes.

Abaixo está um editorconfig simples, como você pode ver, os arquivos python terão 4 espaços para indentação e os arquivos de modelo de pug terão apenas 2.

# 4 space indentation for python files
[*.py]
indent_style = space
indent_size = 4

# 2 space indentation for pug templates
[*.pug]
indent_size = 2
chengbo
fonte
3

Embora você possa configurar a indentação do Vim perfeitamente usando o plug-in de indentação ou manualmente usando as configurações, recomendo usar um script python chamado Vindect que defina automaticamente as configurações relevantes para você quando você abrir um arquivo python. Use esta dica para tornar o uso do Vindect ainda mais eficaz. Quando comecei a editar arquivos python criados por outras pessoas com vários estilos de recuo (tabulação versus espaço e número de espaços), foi incrivelmente frustrante. Mas o Vindect junto com esse arquivo de recuo

Também recomendo:

haridsv
fonte
2

Para aqueles que usam autocmd, é uma prática recomendada agrupá-los. Se um agrupamento estiver relacionado à detecção de tipo de arquivo, você pode ter algo parecido com isto:

augroup filetype_c
    autocmd!
    :autocmd FileType c setlocal tabstop=2 shiftwidth=2 softtabstop=2 expandtab
    :autocmd FileType c nnoremap <buffer> <localleader>c I/*<space><esc><s-a><space>*/<esc>
augroup end

Os agrupamentos ajudam a manter o .vimrc organização, especialmente quando um tipo de arquivo tem várias regras associadas. No exemplo acima, um atalho de comentário específico para arquivos .c é definido.

A chamada inicial para autocmd!diz ao vim para excluir qualquer comando automático definido anteriormente no referido agrupamento. Isso impedirá a definição duplicada se .vimrcfor originada novamente. Veja o :help augrouppara mais informações.

67hz
fonte
1

Eu uso um utilitário que escrevi em C chamado autotab. Ele analisa as primeiras milhares de linhas de um arquivo que você carrega e determina valores para os parâmetros do Vim shiftwidth, tabstope expandtab.

Isso é compilado usando, por exemplo gcc -O autotab.c -o autotab,. As instruções para integração com o Vim estão no cabeçalho do comentário na parte superior.

O Autotab é bastante inteligente, mas pode ser confundido de tempos em tempos, em particular por ter sido mantido de maneira inconsistente usando diferentes estilos de indentação.

Se um arquivo evidentemente usar guias, ou uma combinação de guias e espaços, para recuo, a Autotab descobrirá qual tamanho de guia está sendo usado considerando fatores como o alinhamento de elementos internos em linhas sucessivas, como comentários.

Ele funciona para uma variedade de linguagens de programação e perdoa elementos "fora da banda" que não obedecem a incrementos de indentação, como diretivas de pré-processamento C, rótulos de instrução C, sem mencionar as linhas em branco óbvias.

Kaz
fonte