2012-09-18 12 views
6

Apri spesso interi set di file contemporaneamente da MacVim. Per fare questo, io di solito uso i comandi:L'evidenziazione della sintassi non è attivata in vim quando si aprono più file usando argdo

args *PATTERN* 
argdo tabedit 

Questo carica tutti i file nella directory di lavoro che corrispondono al modello nella lista degli argomenti, e poi li si apre in schede separate. L'evidenziazione della sintassi non viene attivata automaticamente quando lo faccio e devo impostarlo manualmente. Come posso risolvere questo?

risposta

6

Avevo già posted a workaround per :bufdo in una domanda simile; ecco una versione estesa che gestisce anche il tuo caso d'uso. Lavorando intorno l'impostazione automatica di 'eventignore' è abbastanza complicato, quindi è ampiamente commentato:

" Enable syntax highlighting when buffers are displayed in a window through 
" :argdo and :bufdo, which disable the Syntax autocmd event to speed up 
" processing. 
augroup EnableSyntaxHighlighting 
    " Filetype processing does happen, so we can detect a buffer initially 
    " loaded during :argdo/:bufdo through a set filetype, but missing 
    " b:current_syntax. Also don't do this when the user explicitly turned off 
    " syntax highlighting via :syntax off. 
    " The following autocmd is triggered twice: 
    " 1. During the :...do iteration, where it is inactive, because 
    " 'eventignore' includes "Syntax". This speeds up the iteration itself. 
    " 2. After the iteration, when the user re-enters a buffer/window that was 
    " loaded during the iteration. Here is becomes active and enables syntax 
    " highlighting. Since that is done buffer after buffer, the delay doesn't 
    " matter so much. 
    " Note: When the :...do command itself edits the window (e.g. :argdo 
    " tabedit), the BufWinEnter event won't fire and enable the syntax when the 
    " window is re-visited. We need to hook into WinEnter, too. Note that for 
    " :argdo split, each window only gets syntax highlighting as it is entered. 
    " Alternatively, we could directly activate the normally effectless :syntax 
    " enable through :set eventignore-=Syntax, but that would also cause the 
    " slowdown during the iteration Vim wants to avoid. 
    " Note: Must allow nesting of autocmds so that the :syntax enable triggers 
    " the ColorScheme event. Otherwise, some highlighting groups may not be 
    " restored properly. 
    autocmd! BufWinEnter,WinEnter * nested if exists('syntax_on') && ! exists('b:current_syntax') && ! empty(&l:filetype) && index(split(&eventignore, ','), 'Syntax') == -1 | syntax enable | endif 

    " The above does not handle reloading via :bufdo edit!, because the 
    " b:current_syntax variable is not cleared by that. During the :bufdo, 
    " 'eventignore' contains "Syntax", so this can be used to detect this 
    " situation when the file is re-read into the buffer. Due to the 
    " 'eventignore', an immediate :syntax enable is ignored, but by clearing 
    " b:current_syntax, the above handler will do this when the reloaded buffer 
    " is displayed in a window again. 
    autocmd! BufRead * if exists('syntax_on') && exists('b:current_syntax') && ! empty(&l:filetype) && index(split(&eventignore, ','), 'Syntax') != -1 | unlet! b:current_syntax | endif 
augroup END 
+0

Grazie! Questo è il vincitore perché fa esattamente ciò di cui ho bisogno. Apprezzo anche la documentazione approfondita di come funziona. –

+0

Grande; felice di poterti aiutare Senza la documentazione approfondita, non sarei in grado di ricordarlo ed estenderlo da solo. È sempre utile migliorare la propria configurazione in base alle domande Stack Overflow. –

0

io non sono a conoscenza args o argdo ma se avete bisogno di aprire i file che corrispondono a un modello in diverse schede è possibile usare qualcosa come:

:next * 
:tab ball 

:next * apre tutti i file maching il modello con la corretta evidenziazione della sintassi tuttavia, :tab ball apre tutti i file in memoria, il che potrebbe essere un problema se si dispone di buffer che non è necessario aprire nelle schede.

+0

Interesting-- questo si apre tutti i file con evidenziazione della sintassi, che è quello che mi piacerebbe. Ma apre tutti i buffer caricati, che è un grosso problema.Il punto di usare args e argdo è specificare un insieme di file da aprire indipendentemente da ciò che è attualmente caricato. Questa è comunque una risposta decente. Penso che dovresti modificarlo per chiarire che questo li apre con l'evidenziazione della sintassi completa, poiché è di questo che si tratta. –

2

argdo aggiunge Syntax all'impostazione 'eventignore' (vedere :h argdo). Ciò significa che non hai alcun evidenziamento per quei file perché l'evento autocommand della sintassi non viene attivato per quel buffer. Il che fa sembrare che lo 'filetype' non sia impostato. Questo non è vero. È possibile verificare facendo un :set ft?. È possibile eseguire :syntax on per tornare all'evidenziazione della sintassi. Ma questo non è davvero desiderabile e si sente kludgy.

Probabilmente un approccio migliore è quello di liberarsi dall'uso delle schede e utilizzare invece i buffer ei relativi comandi del buffer. I comandi buffer relativi a Arglist sono: :next, :previous, :first e :last. È possibile aprire file specifici con :b file.c o :sb file.c per aprire il buffer in una nuova divisione.

Mi rendo conto che questa è una pillola difficile da inghiottire e ci sono certamente volte in cui si può davvero volere ogni buffer nella propria scheda. Una volta che ti imponi di usare i buffer di più, scoprirai che la necessità di schede è rara. Si consiglia di guardare l'eccellente Vimcast di Drew Neil su How to use tabs. Raccomando anche di utilizzare Tim Pope unimpaired.vim per spostarsi più facilmente nella lista degli argomenti.

Se davvero necessario disporre di ciascuno nel file in uso proprio scheda :argdo tabe allora probabilmente si dovrebbe seguire con un :syntax on o :tabdo doautocmd Syntax

Per maggiori spiegazioni, vedi:

:h :argdo 
:h arglist 
:h buffers 
:h :b 
:h :sb 
:h :next 
:h :tabdo 
:h :doa 
:h Syntax 
:h :syn-on 
+0

Grazie per il consiglio Peter. Io uso i buffer per la maggior parte del tempo, ma a volte le schede sono proprio dove sono. È più semplice passare da un file a un altro rispetto ai buffer quando si hanno buone scorciatoie per: tabp e: tabn. Anche con qualcosa come unimpaired.vim, trovo che la commutazione delle schede è migliore perché hai una buona visualizzazione dei nomi dei buffer sempre sullo schermo. –

+0

Se le schede funzionano per te, allora usali con tutti i mezzi, ma devo dire quando il numero di file inizia ad aumentare, quindi fare qualcosa come "4gt" per ottenere la scheda corretta sembra essere un po 'sciocco. Quindi potresti trovarti a fare qualcosa come 'set swb + = usetab' e iniziare a usare': sb file'. Alla fine, quando ottieni 100 file, potrebbe sembrare inutile. Se ti trovi mai qui, ti suggerisco di abbandonare un buffer per ogni scheda. Metti "set hidden" nel tuo file 'vimrc', impara il maggior numero di comandi buffer che puoi, trova la gioia nelle spaccature, appoggia pesantemente su ctags/cscope e usa i caratteri maiuscoli. –

5

Qualcosa del genere dovrebbe funzionare :

:argdo set eventignore-=Syntax | tabedit 

che rimuove Syntax dall'impostazione eventignore.

+0

Sapevo già che "argdo" rimuoveva l'evidenziazione del synatx ma TIL parlava di "eventignore". Grazie. – romainl

+0

Mi piace la semplicità. Ho completamente smaltito la soluzione semplice. Grazie per aver condiviso. –

+0

Questo è abbastanza buono ma non attiva la sintassi per il primo elemento nell'arglist. Penso che sia perché set eventignore- = Syntax non viene effettivamente eseguito fino a dopo che il buffer è già stato aperto dal comando argdo. Fondamentalmente questo ripete tre passaggi per ogni elemento arglist: (1) apre il prossimo buffer in arglist (nella finestra corrente); (2) imposta eventignore- = Sintassi; (3) aprire una nuova scheda (con un nuovo buffer vuoto). Quindi, quando il ciclo si ripete, l'argomento successivo nell'elenco viene aperto nel buffer vuoto. Uno sfortunato effetto collaterale si ottiene con un sacco di buffer vuoti. –

Problemi correlati