Modifica del comportamento di rientro di Vim in base al tipo di file


379

Qualcuno potrebbe spiegarmi in termini semplici il modo più semplice per modificare il comportamento di rientro di Vim in base al tipo di file? Ad esempio, se apro un file Python dovrebbe rientrare con 2 spazi, ma se apro uno script Powershell dovrebbe usare 4 spazi.


9
A proposito, la convenzione PEP8 per Python afferma che il tabstop dovrebbe essere di 4 spazi e le tab dovrebbero essere di 4 spazi. ref: stackoverflow.com/questions/120926/...
cgseller

Risposte:


304

È possibile aggiungere .vimfile da eseguire ogni volta che vim passa a un determinato tipo di file.

Ad esempio, ho un file ~/.vim/after/ftplugin/html.vim con questo contenuto:

setlocal shiftwidth=2
setlocal tabstop=2

Ciò fa sì che vim utilizzi le schede con una larghezza di 2 caratteri per il rientro (l' noexpandtabopzione è impostata a livello globale altrove nella mia configurazione).

Questo è descritto qui: http://vimdoc.sourceforge.net/htmldoc/usr_05.html#05.4 , scorrere fino alla sezione sui plugin del tipo di file.


229
Dovresti inserirlo ~/.vim/after/ftplugin/html.viminvece. Ma come altri hanno sottolineato di seguito, è molto più bello aggiungere solo autocmd FileType html setlocal shiftwidth=2 tabstop=2al tuo .vimrc.
Aristotele Pagaltzis,

10
Whoops, in realtà, che / è / dove ho quel file. Riparerò la risposta. Non sono d'accordo, tuttavia, penso che separare i comandi per diversi tipi di file in file separati renda tutto molto più semplice, specialmente se si hanno requisiti per molti tipi di file o molte opzioni per alcuni tipi di file.
SpoonMeiser,

3
In realtà, non c'è motivo di usare la directory after per ftplugins. Vim caricherà tutti quelli che trova nel tuo runtimepath, non solo il primo like per i file di sintassi.
graywh

36
Cordiali saluti: non usare js per il tipo di file javascript. Usa invece JavaScript. ( autocmd FileType javascript setlocal shiftwidth=2 tabstop=2)
Kiddo,

13
Devi aggiungere anche filetype plugin onal tuo vimrc.
gatoatigrado,

191

Utilizzare ftplugins o autocommands per impostare le opzioni.

ftplugin

In ~/.vim/ftplugin/python.vim:

setlocal shiftwidth=2 softtabstop=2 expandtab

E non dimenticare di attivarli in ~/.vimrc:

filetype plugin indent on

( :h ftpluginper maggiori informazioni)

autocomando

In ~/.vimrc:

autocmd FileType python setlocal shiftwidth=2 softtabstop=2 expandtab

È possibile sostituire uno qualsiasi dei comandi lunghi o le impostazioni con le loro versioni di SMS:
autocmd: au
setlocal: setl
shiftwidth: sw
tabstop: ts
softtabstop: sts
expandtab:et

Vorrei anche suggerire di imparare la differenza tra tabstope softtabstop. Molte persone non lo sanno softtabstop.


1
Grazie! Grazie anche per quel po 'di' ts 'e' sts '. Ci sono delle pagine particolari che consiglieresti di discutere di questa differenza e come usarla?
jvriesem,

11
@jvriesem Non c'è molto da dire: 'ts' è come vengono visualizzati i caratteri della scheda; 'sts' è quanti "spazi" inserire quando si preme il tasto tab; "sw" è il numero di "spazi" da utilizzare per livello di rientro; 'et' è se usare spazi o tab; 'sta' consente di inserire "spazi" "sw" quando si preme il tasto tab all'inizio di una riga.
graywh,

10
Mi chiedo se sarebbe meglio usare le forme complete, per chiarezza, piuttosto che la frase brusca alla fine.
acqua ghiacciata,

23
swè l'abbreviazione di softwidth, stsè l'abbreviazione di softtabstop, etè l'abbreviazione di expandtab, setlè l'abbreviazione di setlocaled auè l'abbreviazione di autocmd. È possibile utilizzare le forme lunghe anziché le forme brevi.
Flimm,

13
Credo che si swespanda shiftwidthpiuttosto che softwidth.
johncip,

83

modifica il tuo ~/.vimrce aggiungi diversi tipi di file per rientri diversi, ad es. voglio html/rbrientro per 2 spazi e js/coffeefile rientro per 4 spazi:

" 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

fare riferimento a: Impostazione delle preferenze degli spazi bianchi di Vim in base al tipo di file


Il commento per vimrc è singolo ":)
sdkks,

@sdkks Non penso proprio. la doppia virgoletta è un commento, la virgoletta singola 'dà errore su tutto il mio vim di Linux. (7.3+, 8.0 ...)
Siwei Shen 申思维

Si. Il mio commento dice che usa un singolo ", il che significa che non chiuderlo con un altro ". Non sono sicuro del perché l'ho commentato però.
sdkks,

ok, ti ​​ho frainteso. Pensavo che la sola virgoletta significhi, 'ma non lasciata "senza destra " @. @
Siwei Shen 申思维

60

Inserisci i comandi autocmd in base al suffisso del file nel tuo ~ / .vimrc

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

I comandi che stai cercando sono probabilmente ts = e sw =


18
Qual è il vantaggio di questo FileType?
Casey Chow,

3
C'è un modo per invertire la partita?
SystemParadox,

7
Ho avuto problemi a far funzionare i tipi di file con i file html (dal momento che il file .html non è in realtà HTML, ma un file HTML modello con un linguaggio di template). I tipi di file non sembrano riconoscerlo come HTML, ma questo metodo lo farà.
Mark Hildreth,

3
@digitxp: il vantaggio è che l'estensione utilizzata non corrisponde a un "FileType" definito. Ad esempio, nella mia installazione, * .md indica un tipo di file di Modula2 mentre lo sto usando per il markdown. Potrei (a) cambiare le impostazioni di FileType predefinite (b) modificare le impostazioni del tipo di file con una configurazione personalizzata o (c) ottenere rapidamente ciò che voglio usando questa impostazione nel mio file 1 .vimrc con cui sono andato (c).
pdwalker,

Vale la pena sottolineare che, supponendo che la mia rapida lettura dei documenti sia corretta, è possibile aggiungere più comandi per tipo / i di file in questo modo e sono garantiti per essere eseguiti nell'ordine indicato.
underscore_d

23

Di solito lavoro con expandtabset, ma è un male per i makefile. Di recente ho aggiunto:

:autocmd FileType make set noexpandtab

alla fine del mio file .vimrc e riconosce Makefile, makefile e * .mk come makefile e non espande le schede. Presumibilmente, puoi estenderlo.


L'opzione migliore è abilitare: plugin del tipo di file. Quello predefinito per Vim include: setl noet, quindi non hai nemmeno bisogno di quell'aucmd nel tuo vimrc.
graywh

OK. Puoi spiegarne i benefici e cosa comporta farlo? Perché i plugin del tipo di file sono migliori di autocmd? Quando usare autocmd? Non usato?
Jonathan Leffler,

5
I plugin di tipi di file forniti con Vim faranno cose utili come "setlocal noexpandtab" per i makefile, per esempio. I comandi automatici e ftplugin per cose personali come la larghezza del cambio non contano: è solo il modo in cui scegli di strutturare la tua configurazione di VIM.
graywh,

17

Personalmente, utilizzo queste impostazioni in .vimrc:

autocmd FileType python set tabstop=8|set shiftwidth=2|set expandtab
autocmd FileType ruby set tabstop=8|set shiftwidth=2|set expandtab

22
Molte lingue hanno convenzioni stabilite da tempo, così come alcune società. Prendi NodeJS come esempio del primo. Le schede dovrebbero essere due spazi. Mal di testa, e piuttosto sciocco, ma importante.
Paul Hazen,

3
Perché le schede dovrebbero essere le stesse per tutte le circostanze? Per un file di configurazione, 8 schede spaziali funzionano bene, ma per il codice con molti rientri, 2 è molto più facile da gestire. E poi ci sono convenzioni fisse: node.js dovrebbe avere 2 schede spazio e python non è effettivamente sintatticamente valido con qualcosa di diverso da 4 schede spazio.
felixphew,

1
@felixphew Python è perfettamente corretto con qualsiasi numero di spazi (o anche schede) purché rimanga lo stesso per tutto il percorso.
James,

@DJMcMayhem Hai ragione - avrei dovuto dire "consiglia vivamente".
Felixphew,

1
+1 a Nello. Il personaggio da tabulazione ha una lunga tradizione nel significato di un salto alla posizione successiva con un multiplo di 8 caratteri. È solo perché la gente voleva usare la tab per "il prossimo trattino che sembra buono nella mia lingua" e perché alcuni editor di testo non si sono preoccupati di fare la differenza tra "aggiungere un carattere di tabulazione" e "aggiungere spazi per il rientro", e le persone ottimizzato il loro editor per farlo a modo loro, che ora abbiamo questo casino in cui le schede non mostrano mai il modo previsto. Il codice sorgente è testo e lo standard per il testo è una scheda di 8 caratteri.
Florian F,

6

Questo potrebbe essere noto alla maggior parte di noi, ma comunque (sono rimasto perplesso per la prima volta): fare :set et( :setexpandtabs) non cambia le schede già esistenti nel file, bisogna farlo :retab. Per esempio:

:set et
:retab

e le schede nel file sono sostituite da spazi sufficienti. Per riavere le schede semplicemente:

:set noet
:retab

4

Oggi, potresti provare editorconfig , c'è anche un plugin vim per esso. Con questo, sei in grado non solo di modificare le dimensioni del rientro in vim, ma in molti altri editor, mantenere stili di codifica coerenti.

Di seguito è riportato un semplice editorconfig, come puoi vedere, i file python avranno 4 spazi per il rientro e i file modello pug ne avranno solo 2.

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

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

3

Mentre puoi configurare il rientro di Vim bene usando il plug-in rientro o manualmente usando le impostazioni, ti consiglio di usare uno script Python chiamato Vindect che imposta automaticamente le impostazioni pertinenti quando apri un file Python. Usa questo consiglio per rendere ancora più efficace l'utilizzo di Vindect. Quando ho iniziato a modificare i file Python creati da altri con vari stili di rientro (tab vs spazio e numero di spazi), è stato incredibilmente frustrante. Ma Vindect insieme a questo file di rientro

Consiglio anche:


2

Per quelli che usano autocmd, è una buona pratica raggrupparli insieme. Se un raggruppamento è correlato al rilevamento del tipo di file, potresti avere qualcosa del genere:

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

I raggruppamenti aiutano a mantenere .vimrcorganizzato soprattutto quando un tipo di file ha più regole associate. Nell'esempio sopra, viene definito un collegamento di commento specifico per i file .c.

La chiamata iniziale a autocmd!dice a vim di eliminare qualsiasi comando automatico precedentemente definito in detto raggruppamento. Ciò impedirà la duplicazione della definizione se .vimrcviene di nuovo proveniente. Vedi il :help augroupper maggiori informazioni.


1

Uso un'utilità che ho scritto in C chiamato autotab. Analizza le prime poche migliaia di righe di un file che carichi e determina i valori per i parametri Vim shiftwidth, tabstope expandtab.

Questo viene compilato utilizzando, per esempio, gcc -O autotab.c -o autotab. Le istruzioni per l'integrazione con Vim sono nell'intestazione del commento in alto.

L'autotab è abbastanza intelligente, ma può essere confuso di volta in volta, in particolare perché sono stati mantenuti in modo incoerente utilizzando diversi stili di rientro.

Se un file usa evidentemente tabulazioni, o una combinazione di tabulazioni e spazi, per il rientro, Autotab capirà quale dimensione di tabulazione viene usata considerando fattori come l'allineamento di elementi interni attraverso linee successive, come i commenti.

Funziona con una varietà di linguaggi di programmazione e perdona gli elementi "fuori banda" che non obbediscono agli incrementi di rientro, come le direttive di preelaborazione C, le etichette delle dichiarazioni C, per non parlare delle ovvie righe vuote.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.