Vim: applica le impostazioni ai file nella directory


103

Come si specificano le impostazioni di Vim per tutti i file nella directory corrente?

La soluzione ideale sarebbe se Vim cercasse e leggesse un .vimrc nella directory corrente prima di cercare ~ / .vimrc e applicasse lì le impostazioni per l'intero albero.

Ho visto un plug-in , ma questo significa che le impostazioni applicate non sono trasparenti poiché richiedono l'installazione del plug-in. Al contrario, una modeline è trasparente poiché indipendentemente dal vimrc di un utente o dall'invocazione di vim specifica, le impostazioni della modeline verranno applicate a quel file.

Le cose che ho provato sono

  • inserendo un .vimrc nella directory di lavoro
  • :so vimrc nella modeline.

Suppongo che entrambi non funzionino per motivi di sicurezza. Non ho bisogno della piena potenza di un vimrc; sarebbe sufficiente essere vincolati a impostazioni accettabili da una modella. Il mio obiettivo è rendere più facile per i vimmers adottare gli standard di codifica in un progetto.


Risposte:


42

Sono un sostenitore del modo plug-in . Per diverse ragioni:

  • Le modeline sono particolarmente limitate: non possiamo impostare variabili (che sintonizzano altri plugin (ft), come "le parentesi graffe del for-snippet devono essere su una nuova riga?"), O chiamare funzioni da esse (non mi limito agli standard di codifica, ho anche impostato il makefile da utilizzare a seconda della directory corrente)
  • DRY : con le modeline, un'impostazione deve essere ripetuta in ogni file, se ci sono troppe cose da impostare o accordature da modificare, diventerà presto difficile da mantenere, inoltre, richiederà l'uso di un plugin di espansione del modello ( che dovresti considerare se hai diversi vimmers nel tuo progetto).
  • Non tutti usano vim per sviluppare. Non voglio essere infastidito dalle impostazioni dell'editor di altre persone, perché dovrei parassitare le loro?
  • È più facile chiedere ai vimmers di installare lo stesso plugin, invece di chiedere loro di copiare-incollare e mantenere le stesse righe nel loro .vimrc
  • Le impostazioni possono essere salvate con gli altri file di progetto (cvs / svn / git / qualunque cosa)
  • È davvero facile avere un file di configurazione per progetto: con il plug-in, ho un file di configurazione globale per gli standard di codifica del progetto complessivo e file di configurazione specifici per ogni sottoprogetto (quale makefile usare, quale eseguibile chiamare , ...)

BTW, la soluzione di sth può essere utilizzata per generare un singolo file di configurazione. Questo è molto simile all'approccio dei plugin tranne per il fatto che .vimrc deve essere parassitato con opzioni non globali e non supporta facilmente file di configurazione multipli / condivisi.


Ho notato che devi salvare un nuovo file nel percorso prima che possa eseguire correttamente il plugin
cmcginty

Infatti. Questa famiglia di plugin definisce semplicemente un framework. È ancora necessario scrivere le definizioni specifiche del progetto in un file, che verrà automaticamente fornito dal framework.
Luc Hermitte

1
Tieni presente che Luc collega un suo plug-in. Questo sembra funzionare molto meglio di quello collegato alla domanda. Grazie.
dati

Bene. Non posso dirlo. Dato che uso il mio da anni, non ho mai osservato da vicino le altre implementazioni. Di tanto in tanto ricevo una segnalazione di bug che alla fine prendo in considerazione. A proposito, la mia versione è implementata per essere attivata prima di mu-template al fine di impostare variabili specifiche del progetto prima di espandere i modelli (che è abbastanza utile per recuperare la directory principale del progetto corrente e tagliarla dai
nomi di

1
@JasonMcCarrell La mia implementazione di local_vimrc e Markus "embear" Braun ha il supporto per blacklist, whitelist ... Se hai solo bisogno di specificare come è fatto il rientro, il plugin EditorConfig-vim potrebbe essere una scelta migliore.
Luc Hermitte

91

Puoi inserire qualcosa del genere $VIM/vimrc

autocmd BufNewFile,BufRead /path/to/files/* set nowrap tabstop=4 shiftwidth=4

1
Questo è ricorsivo, ma solo con *. Se provi a ridurlo a / path / to / files / o / path / to / files non funzionerà.
SystemParadox

Questo è ottimo se il tuo progetto ha un albero di file scritto con "noexpandtab" e un altro albero con tutti i file "expandtab" (ad esempio CodeIgniter). È possibile impostare l'azione corretta per i file in ogni albero individualmente con un file di configurazione.
user9645

2
Stranamente, questo non ha funzionato quando il mio percorso includeva un collegamento simbolico; Ho dovuto inserire il percorso completo senza collegamenti simbolici prima che funzionasse.
Dolan Antenucci

Vedi la risposta di joseph07 sull'utilizzo di un "trusted vim" come alternativa, inversione di questo approccio (distribuito .vimrc vs centralizzato).
Nathan Schulte

50

Suggerisco vivamente di non utilizzare set exrc

Anche con set secure, sotto * nix, vim eseguirà ancora comandi automatici, shell e altri, se si possiede il file. Quindi se sei riuscito a modificare un file in quel tarball ti ho inviato con un .vimrccontenente:

autocmd BufEnter * :silent! !echo rm -rf ~/

probabilmente sarai meno divertito di me.


6
Questo vale anche per i plugin che vengono eseguiti automaticamente quando viene caricato vim.
Luc Hermitte

31

Questa domanda è vecchia, ma sembra una preoccupazione abbastanza naturale e persistente.

La mia soluzione è piuttosto semplice. Metto un .vimrcfile nella directory principale dei miei progetti. La prima riga del .vimrcfile di solito fa origine ~/.vimrce quindi aggiunge la configurazione particolare che desidero. Ho alias tvim='vim -u .vimrc'e utilizzo tvimnelle directory dei miei progetti personali. "tvim" per "trusted vim", nel senso che se lo eseguo in una directory con un .vimrcfile e qualcosa va storto, non ho nessuno da incolpare tranne me stesso, poiché ho detto esplicitamente che mi fidavo. Inoltre, tengo un gruppo di questi memorizzati in modo che a volte posso semplicemente collegare in modo softlink quello che voglio per un particolare tipo di progetto.


1
Questo approccio è semplice e corrisponde perfettamente alle mie esigenze.
Jinxed

Quando provo questo e source $HOME/.vimrcdal mio locale .vimrc, Vim si lamenta di non riuscire a trovare i miei plugin installati a livello di sistema (patogeno in questo caso; il execute pathogen#infect()comando in cima al mio $HOME/.vimrcfallisce con Unknown function ...). Come posso risolvere questo problema?
Nathan Schulte

20

Il posizionamento di un .vimrc nella directory di lavoro è effettivamente supportato, disabilitato solo per impostazione predefinita. Vedere :h 'exrc'e :h startupper i dettagli, l'impostazione 'exrc'abiliterà la lettura .vimrcdalla directory corrente.

Si consiglia anche di :set secureutilizzare questo. Questo blocca :autocmd, esegue la shell e scrive i comandi .vimrcnella directory corrente.

Un'altra cosa che potrebbe valere la pena guardare è l'impostazione di una sessione ( :h session) con una vista e impostazioni standard per il progetto.

Detto questo, probabilmente sceglierei l'opzione plug-in descritta da Luc Hermitte personalmente.


6
Si prega di vedere il commento di phen. Ciò può portare a gravi implicazioni per la sicurezza.
dati

11

Per ridurre al minimo i rischi per la sicurezza con QUALSIASI funzionalità di "esecuzione automatica" per QUALSIASI COSA in questi giorni, posso consigliarvi di utilizzare le funzionalità esistenti di vim invece dei plug-in (bagaglio portabilità)?

Per esempio.

Il file vimrc della mia cartella locale si chiama "_gvimrc" (apposta). Questo riduce la speranza per persone come Phen di divertirsi a nostre spese. :-)

Nel mio file $ VIM / .vimrc, ho inserito:

if filereadable("_gvimrc")
    source _gvimrc
endif

alla fine.

Uso "filereadable ()" su "fileexists ()" poiché il secondo ha qualche stranezza quando torturato con l'apertura simultanea di più file (10+), (non so perché).

Ovviamente, puoi dare il tuo nome file univoco per offuscare ulteriormente i potenziali creatori di problemi. Come "_mygvimrc", "_gobbledygook", ecc. Devi solo accontentarti di un nome standardizzato e procurarlo di conseguenza nel tuo $ VIM / .vimrc. Affidarsi agli interni di vi / vim per questo esclude problemi di portabilità. MA NON nominarlo .vimrc (o _vimrc) per prevenire il sourcing ricorsivo nel caso in cui tu stia modificando il file $ VIM / .vimrc con vim in un secondo momento.

Lo uso da Windoze 98SE, tramite Windork XP Pro e ora Windorkier 7 (già da più di 5 anni). Contrassegnerò un elenco di file .txt in Explorer e quindi userò "Modifica con più Vim", risultando in più finestre di Vim che si apriranno contemporaneamente. Per il mio lavoro, lo faccio più volte al giorno, tutti i giorni. Tutti i file sono stati trattati con ciò che ho impostato nel mio _gvimrc locale.


Qui, la sfiducia per la portabilità dei plug-in non ha fondamento in quanto questi plug-in local_vimrc (almeno il mio) sono portatili (erano mantenuti su vari sistemi operativi diversi e persino su Windows 95). Anche la questione del rischio per la sicurezza è esagerata: se seguiremo in questo modo, non installeremo mai nulla per facilitare il nostro lavoro.
Luc Hermitte

Ma, per quanto mi riguarda, il primo vero problema è che, con il tuo approccio, devi lavorare dalla directory esatta che contiene il file _gvimrc (che è un brutto nome in quanto dovrebbe contenere cose specifiche di gvim). Se il tuo progetto è composto da più directory, che potrebbero richiedere una configurazione comune, e da specifiche (in caso di più moduli), questo mostrerà rapidamente i suoi limiti.
Luc Hermitte

Il secondo problema è che puoi lavorare su un solo progetto alla volta: se voglio lavorare su OTB, openjpeg e un progetto che ingrandi entrambe le librerie, questa soluzione non mi consentirà di avere un'impostazione specifica per ciascuna delle tre progetti.
Luc Hermitte

Funziona anche per il caricamento in cascata di un file di sintassi da una directory locale.
maharvey67

2

Supponendo che le persone non aggiungano file ogni pochi giorni, puoi probabilmente aggiungere una modeline all'inizio di ogni file. In effetti, se il tuo sistema di controllo della versione lo consente, potresti probabilmente applicare una regola che dice che ogni file deve avere una modeline quando viene archiviato.



2

Usa "editorconfig"

Se i tipi di standard di codifica che desideri applicare sono correlati allo stile di rientro, alla dimensione della scheda, al formato del file e al set di caratteri, potresti voler esaminare "editorconfig" , che è uno standard per diversi editor per specificare questo tipo di impostazioni un progetto specifico e chiedi a tutti gli editor di seguire quella configurazione.

La specifica "editorconfig" consente ai progetti di richiedere impostazioni diverse a seconda delle estensioni dei file o dei nomi all'interno del progetto. (Quindi puoi avere Makefile usando TAB, i tuoi script Python usando 4 spazi e i tuoi script di shell usando 2 spazi per il rientro.)

Hai bisogno di un plug-in per usare "editorconfig" in Vim. Il sito web ufficiale ne fornisce uno, ma personalmente consiglierei sgur / vim-editorconfig , che è scritto in puro Vimscript, quindi non devi preoccuparti troppo delle dipendenze esterne.

Poiché "editorconfig" mira alla compatibilità tra editor, è piuttosto limitato in ciò che fa, quindi se vuoi che siano coerenti spazi bianchi, formato file (DOS vs Unix) e codifica (Unicode utf-8, ecc.), Allora "editorconfig " è per te.



0

Ho guardato i plugin che esistevano e non mi piaceva nessuno di loro, quindi ho scritto una semplice funzione che si appoggia a vim-fugitive . Il vantaggio di questo è che sa che la radice del progetto è sempre la radice del repository e inoltre posso eseguire l'hash del file per mantenere una tabella di attendibilità. Basta inserire quanto segue nel tuo .vimrcfile.

function LoadRepoVimrc()
  let l:path = fugitive#repo().tree('.vimrc')
  if filereadable(l:path)
    let l:sha1 = fugitive#repo().git_chomp('hash-object',l:path)
    if !exists('g:SAFE_VIMRC') | let g:SAFE_VIMRC = {} | endif
    if has_key(g:SAFE_VIMRC,l:path) && g:SAFE_VIMRC[l:path] ==? l:sha1
      execute 'source '.fnameescape(l:path)
    elseif confirm("Trust ".l:path."?", "&Yes\n&No",2) == 1
      let g:SAFE_VIMRC[l:path] = l:sha1
      execute 'source '.fnameescape(l:path)
    else
      execute 'sandbox source '.fnameescape(l:path)
    endif
  endif
endfunction
autocmd User FugitiveBoot call LoadRepoVimrc()
set viminfo ^= !

Se l' !opzione è impostata viminfosull'impostazione, il SAFE_VIMRCdizionario verrà conservato tra le esecuzioni (nota ^per anteporre l'opzione in modo che non rovini l' nopzione).

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.