In sintesi
Ci sono alcuni modi per farlo, di cui molti sono stati suggeriti, ma ho pensato di riassumerli con due extra:
- Per directory vimrc - ha lo svantaggio che Vim deve essere avviato nella directory giusta: se il tuo progetto è in
~/project1e lo hai ~/project1/.vim.custome lo fai cd ~ ; vim project1/file.c, le impostazioni personalizzate non verranno trovate.
- Modelines - molto efficaci, ma ha lo svantaggio di doverli aggiungere a tutti i file (e ricordarsi di aggiungerli a nuovi file)
- Comandi automatici specifici per directory: questo è molto efficace
- Cerca un'intestazione specifica nel file (vedi sotto): questa è quella che ho usato di più in passato, dove ho lavorato per diverse aziende o su progetti chiaramente denominati
- Vimrc per directory che viene controllato all'apertura del file (vedi sotto). Un altro abbastanza facile da implementare, soprattutto se il codice del progetto è tutto in un unico posto.
Scansione per un'intestazione
In molte organizzazioni, c'è un'intestazione standard (con un avviso di copyright e il nome del progetto, ecc.) Nella parte superiore di ogni file sorgente. Se questo è il caso, puoi fare in modo che Vim scansiona automaticamente le prime (ad esempio) 10 righe del file cercando una parola chiave. Se lo trova, può modificare le tue impostazioni. L'ho modificato per renderlo più semplice del modulo che uso (che fa molte altre cose), ma crea un ~/.vim/after/filetype.vim(se non ne hai ancora uno) e aggiungi qualcosa del genere:
au FileType * call <SID>ConfigureFiletypes(expand("<amatch>"))
" List of file types to customise
let s:GROUPNAMETypes = ['c', 'cpp', 'vhdl', 'c.doxygen']
func! <SID>CheckForGROUPNAMECode()
" Check if any of the first ten lines contain "GROUPNAME".
" Read the first ten lines into a variable
let header = getline(1)
for i in range(2, 10)
let header = header . getline(i)
endfor
if header =~ '\<GROUPNAME\>'
" Change the status line to make it clear which
" group we're using
setlocal statusline=%<%f\ (GROUPNAME)\ %h%m%r%=%-14.(%l,%c%V%)\ %P
" Do other customisation here
setlocal et
" etc
endif
endfunc
func! <SID>ConfigureFiletypes(filetype)
if index(s:GROUPNAMETypes, a:filetype) != -1
call <SID>CheckForGROUPNAMECode()
endif
endfunc
Ogni volta che viene aperto un file di qualsiasi tipo e viene impostato il tipo di file (la au FileType *riga), ConfigureFiletypesviene chiamata la funzione. Questo controlla se il tipo di file è nell'elenco dei tipi di file associati al gruppo corrente (GROUPNAME), in questo caso 'c', 'cpp', 'vhdl' o 'c.doxygen'. Se lo è, chiama CheckForGROUPNAMECode (), che legge le prime 10 righe del file e se contengono GROUPNAME, esegue alcune personalizzazioni. Oltre a impostare le schede di espansione o qualsiasi altra cosa, cambia anche la barra di stato per mostrare chiaramente il nome del gruppo in modo che tu sappia che ha funzionato a colpo d'occhio.
Verifica della configurazione all'apertura
Proprio come il suggerimento di JS Bangs, avere un file di configurazione personalizzato può essere utile. Tuttavia, invece di caricarlo in vimrc, considera qualcosa di simile, che controllerà quando un file .c viene aperto per un .vim.custom nella stessa directory del file .c.
au BufNewFile,BufRead *.c call CheckForCustomConfiguration()
function! CheckForCustomConfiguration()
" Check for .vim.custom in the directory containing the newly opened file
let custom_config_file = expand('%:p:h') . '/.vim.custom'
if filereadable(custom_config_file)
exe 'source' custom_config_file
endif
endfunction