Come passare da una configurazione all'altra di vim con un comando o file vimrc locali?


85

Lavoro in diversi gruppi, ognuno dei quali ha i propri standard di tabulazione / rientro / spaziatura in C.

C'è un modo per avere configurazioni VIM selezionabili separate per ciascuna, quindi, quando modifico un file, è possibile:

  • Faccio qualcosa come set group=1selezionare una configurazione
  • un .vimrc locale che risiede nella directory di lavoro viene utilizzato per impostare automaticamente la configurazione


Vedi anche la domanda Alterna tra due diverse configurazioni di vim su superuser.
Hotschke

Risposte:


40

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

66

Ho questo in $HOME/.vimrc:

if filereadable(".vim.custom")
    so .vim.custom
endif

Questo mi permette di mettere un .vim.customfile in ogni directory per caricare comandi e opzioni specifici per quella directory. Se stai lavorando su più progetti che hanno strutture di directory profonde, potresti aver bisogno di qualcosa di più sofisticato (ad esempio, sali sull'albero delle directory finché non .vim.customviene trovato un), ma la stessa idea di base funzionerà.

AGGIORNARE:

Ora faccio qualcosa del genere per leggere un .vimfile dalla stessa directory del file che sto modificando, indipendentemente da quale sia la directory corrente.

let b:thisdir=expand("%:p:h")
let b:vim=b:thisdir."/.vim"
if (filereadable(b:vim))
    execute "source ".b:vim
endif

1
È fantastico, non l'ho mai visto!
Jim Mitchener,

1
Questa è un'ottima soluzione per i progetti che vivono in repository!
bradreaves

3
L' 'exrc'opzione consente già di fare qualcosa di molto simile a questo. Caricherà un .vimrc/ .exrc/ .gvimrcnella directory di lavoro corrente.
jamessan

Il commento su exrcdovrebbe essere la risposta giusta. Tutto il resto sembra o hacky e complicato.
silvenon

L'uso exrcè bello, ma apprezzo avere il file corretto anche quando non sono nella stessa directory di lavoro del file che sto modificando.
JSB ձոգչ

34

Puoi anche inserire comandi automatici nel tuo .vimrcche imposta opzioni specifiche in base al percorso.

au BufRead,BufNewFile /path/to/project1/* setl sw=4 et
au BufRead,BufNewFile /path/to/project2/* setl sw=3 noet

Questo è ottimo quando non hai il controllo del repository in modo da non poter inserire i file ".vim.custom" lì dentro. Mi piace che mantenga pulito il repository. Grazie. Disclaimer: se il percorso continua a cambiare in un modo non amichevole, allora la versione ".vim.custom" è forse più carina supponendo che si possa modificare il repository.
lpapp

17

Plugin che fa la cosa giusta: http://www.vim.org/scripts/script.php?script_id=441

“Questo plugin cerca i file vimrc locali nell'albero del filesystem del file attualmente aperto. Per impostazione predefinita, cerca tutti i file ".lvimrc" dalla directory del file fino alla directory principale e li carica in ordine inverso. Il nome del file e la quantità di file caricati è personalizzabile tramite variabili globali. "


3
E la versione GitHub supporta anche il caricamento con agenti patogeni :-)
Graza

Un altro plugin simile è localrc.vim; consente anche impostazioni per directory specifiche del tipo di file; Lo trovo indispensabile. vim.org/scripts/script.php?script_id=3393
Ingo Karkat

12

Supponendo che i tuoi colleghi sviluppatori non si lamentino di questo, puoi sempre aggiungere le impostazioni di vim a ciascun file nei commenti.

/*
 * vim:ts=4:sw=4:expandtab:...
 */

int main(int argc, char **argv)
{
    ...

2
Sono l'unico ahem dev illuminato sulla maggior parte delle mie squadre, in modo che nessuno dovrebbe mente. Questa è una soluzione per file davvero accurata.
bradreaves

1
Preferisco aggiungerli in fondo in modo che non siano invadenti, ma immagino che sia una questione di stile.
nyuszika7h

5

Ho creato uno strumento open source proprio per questo scopo. Dimentica le intestazioni, la scansione, le configurazioni e i file vimrc locali.

Prova a nuotare.


Nuotare

swimè uno strumento rapido per cambiare file vimrc e creare comodi alias. Ecco un breve elenco di utilizzo. Vedere il repository GitHub per una gif dettagliata e le istruzioni per il download:


Utilizzo

swim add ~/dotfiles/myVimrc favorite    #Add new swim alias
swim ls                                 #Show available swim aliases
swim add https://raw.githubusercontent.com/dawsonbotsford/swim/master/exampleVimrcs/vimrcWikia.vim example
swim with favorite         #Set alias favorite as primary .vimrc
swim with main             #Set alias main as primary .vimrc

Leggi di più

https://github.com/dawsonbotsford/swim


4

Dopo aver provato il plugin localvimrc suggerito dal poster precedente, mi piace molto avere un controllo non futzy per progetto sulle impostazioni di vim.

Chiede conferma prima di caricare un file .lvimrc per impostazione predefinita, ma esiste un'impostazione per caricare automaticamente i file .lvimrc. Alcuni potrebbero vederlo come un buco di sicurezza, ma funziona come pubblicizzato.

Ho scelto di .gitignore dei file .lvimrc. In alternativa puoi archiviarli come una forma di impostazioni condivise (espansione di tab / spazio, tabstop, altre impostazioni specifiche del progetto).


1
Questo script è fantastico: github.com/MarcWeber/vim-addon-local-vimrc . 1) Ora chiede solo una volta e contrassegna l'hash del file come OK. 2) Attraversa l'albero delle directory dalla directory principale alla directory corrente, recuperando i file con priorità più alta più vicini per ultimi.
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

Perché aggiungere il .lvimrcfile a .gitignore? Il punto è che tutti coloro che usano vim e hanno il plugin installato ottengono le stesse impostazioni.
nyuszika7h

2
@ nyuszika7h alcune impostazioni devono essere applicate, mentre altre sono puramente personali. Per le impostazioni che devono essere applicate a tutti, EditorConfig è ancora migliore in quanto è indipendente dall'editor: github.com/editorconfig/editorconfig-vim
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

1

Come accennato da sledge, l'utilizzo di quel plug-in è l'opzione migliore che ho visto e utilizzato. jerseyboy ha commentato che l'utility consiglia di chiedere conferma prima del caricamento (es. dopo aver aperto ogni file). Per evitarlo, imposta come principale .vimrcl'elenco dei .lvimrcfile locali :

let g:localvimrc_whitelist='/development/kernel/.lvimrc'


1

Ecco una variazione di Jamessan

function! ConditionalLoad()
    let cwd = getcwd()
    if getcwd() =~ $HOME . "/src/mobile"
        so $HOME/.vim.mobile
    endif
endfunction
autocmd VimEnter * call ConditionalLoad()

Avvio frequentemente vi senza un file specifico a cui sto saltando, quindi questo abilita il caricamento della configurazione in modo condizionale in base alla directory di lavoro corrente. Lo svantaggio è che la configurazione non viene applicata in base al file ma fuori dalla directory di lavoro.


Esattamente quello che stavo cercando. Come esempio di utilizzo: ho inserito questo codice ~/.vimrc, cambiato /src/mobilenella directory dei miei progetti Symfony (nel mio caso era /www/symfony) e modificato .vim.mobileper .vim.symfonypoi inserire la nuova configurazione .vimrc all'interno del ~/.vim.symfonyfile
jmarceli

1

Lavoro in diversi gruppi, ognuno dei quali ha i propri standard di tabulazione / rientro / spaziatura in C.

Lavoro con tutti i tipi di open source, tutti allo stesso tempo. Non è pratico creare .vimrcfile separati e riconfigurare gli standard di formattazione. Più di dieci anni fa, finalmente mi sono stancato di occuparmi della configurazione dell'editor e ho scritto un programma chiamato autotabper gestirlo.

Quando autotabviene impostato con Vim suggerito, ogni volta che si carica un file in Vim, autotabviene richiamato su di esso e l'output delle impostazioni di Vim autotabviene passato a un :setcomando.

autotablegge diverse migliaia di righe dal file, le analizza e determina le impostazioni per i parametri expandtab, tabstope shiftwidth.

Determina se il file utilizza tabulazioni o solo spazi per il rientro e calcola la dimensione del rientro. Se il file è rientrato con le tabulazioni, calcola la dimensione della tabulazione corretta, basandosi sul rendering del file di esempio utilizzando varie dimensioni di tabulazione e giudicandolo in base a euristiche come l'allineamento linea su linea degli elementi interni.

Funziona abbastanza bene che ho smesso di modificare l'algoritmo anni fa. Se si confonde, è quasi sempre perché il file presenta problemi di formattazione, come l'uso di più convenzioni contemporaneamente.

È anche "agnostico" del tipo di file e funziona bene con una varietà di lingue diverse. Lo uso non solo su C, ma anche su script di shell, Lisp, Makefiles, HTML e altro.

Si noti che non gestisce altri parametri di formattazione che potrebbero essere specifici del progetto, come ad esempio, nei file C, se le caseetichette in switchun'istruzione sono rientrate o meno, o se gli elenchi di argomenti di funzioni avvolti sono semplicemente rientrati o allineati al parentesi aperta della lista degli argomenti. Vim ha impostazioni per quel genere di cose, quindi il programma potrebbe essere plausibilmente esteso per analizzare lo stile e produrre quei parametri.


0

Cercando principalmente lo stesso problema, ho anche trovato il plug-in Sauce: http://www.vim.org/scripts/script.php?script_id=3992

Afferma:

Sauce è un gestore leggero per più file vimrc, che può essere utilizzato per caricare impostazioni diverse per ambienti diversi. In breve, è possibile mantenere molti file di impostazioni di vim diversi e caricare solo quelli che ti servono quando ne hai bisogno.

Trovo particolarmente interessante che mantenga la configurazione tutta nella sua directory dei dati invece di aspettarsi che l'utente sparga dotfile attraverso il filesystem. Questo però spesso è piuttosto una questione di gusti personali.

Devo ancora provarlo però.


0

Puoi usare stow per cambiare configurazione (qualsiasi dotfile, non solo .vimrc)

Installa stow:

$ apt install stow

Crea più directory per ogni configurazione:

~$ ls -d ~/dotfiles/vim*
vim-all vim-webdev vim-go

Metti diversi .vimrcin loro:

$ find ~/dotfiles -name .vimrc
/home/username/vim-golang/.vimrc
/home/username/vim-webdev/.vimrc
/home/username/vim-all/.vimrc

Ora puoi istanziare la configurazione di vim-golang con questo comando (dovrebbe essere eseguito nella directory dotfiles):

~$ cd ~/dotfiles

dotfiles$ stow -v vim-golang
LINK: .vimrc => dotfiles/vim-golang/.vimrc

Ora è collegato:

$ cd ~ && ls -l .vimrc 
.vimrc -> dotfiles/vim-golang/.vimrc

Se hai bisogno di cambiare configurazione, ripeti semplicemente stow:

~$ cd dotfiles

dotfiles$ stow -v -D vim-golang
UNLINK: .vimrc

dotfiles$ stow -v vim-webdev
LINK: .vimrc => dotfiles/vim-webdev/.vimrc

$ cd ~ && ls -l .vimrc 
.vimrc -> dotfiles/vim-webdev/.vimrc

Maggiori informazioni qui: Gestione dei dotfile con GNU stow

Pro : piuttosto semplice, nessuna dipendenza dal plugin vim, può essere usato per gestire tutti i dotfile, non solo .vimrc.

Contro : le configurazioni sono indipendenti l'una dall'altra, è necessario gestirle / aggiornarle ciascuna separatamente (se non cambi / aggiorni le configurazioni troppo spesso, non sarà il problema).

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.