Disabilita l'evidenziazione della sintassi in base alla dimensione e al tipo di file


16

Spesso devo modificare vari file XML con vim, che variano di dimensioni selvagge - dai file di configurazione contenenti alcune righe allineate ai file di dati di produzione con dimensioni fino a 2 GB. Avere l'evidenziazione della sintassi abilitata è ovviamente una pessima idea quando si tratta di file di grandi dimensioni, quindi voglio disabilitarlo se il file è più grande di una soglia.

Non sono riuscito a farlo funzionare usando autocommanddirettamente per disabilitare l'evidenziazione della sintassi, poiché apparentemente il comando viene eseguito prima che la sintassi sia abilitata quando si avvia vim dalla shell:

" this autocmd has no effect except for the echo:
autocmd Filetype xml if getfsize(@%) > 1000000 | echom '!' | syntax off | endif

Ho trovato una soluzione in quanto posso disabilitare l'evidenziazione della sintassi a livello globale, quindi riaccenderlo per tutti gli altri tipi di file diversi da xml e attivarlo per il tipo di file xml se il file non è più grande della soglia:

syntax off
autocmd Filetype * syntax off
autocmd Filetype * if &ft != 'xml' | syntax enable | endif
autocmd Filetype xml if getfsize(@%) < 1000000 | syntax enable | endif

Questo sembra funzionare, ma sembra sbagliato e diventerà ingestibile quando voglio farlo per più tipi di file e condizioni. Inoltre, influenza tutti i buffer. Qual è il modo corretto di disabilitare l'evidenziazione della sintassi in un buffer in condizioni specifiche?



Sebbene questa Q sia ben scritta, sembra coprire sostanzialmente lo stesso terreno (in effetti, un sottoinsieme) di questo: vi.stackexchange.com/questions/149/…
Andrew Ferrier,

4
@AndrewFerrier Direi contro questo. L'altra domanda riguarda i suggerimenti generali per la gestione di file di grandi dimensioni. Il mio riguarda l' implementazione di un pezzo piuttosto specifico del puzzle in base a una determinata serie di restrizioni. Basta confrontare le risposte: le risposte all'altra domanda mi diranno di disattivare la sintassi, ma non come farlo dinamicamente in un singolo buffer per un singolo tipo di file. Quindi non risolverà il mio problema molto più specifico. Sono correlati ma non duplicati quando chiedono cose diverse e portano a risposte diverse.
l4mpi,

l4mpi, questo è un punto giusto, non avevo notato anche la cosa del tipo di file. Ho solo testato le acque della nuova beta qui parzialmente! Punto preso. Ritiro il mio doppio voto.
Andrew Ferrier,

Risposte:


11

Questo commento di derobert mi ha portato alla soluzione:

autocmd Filetype xml if getfsize(@%) > 1000000 | setlocal syntax=OFF | endif

Ciò sembra disabilitare in modo affidabile l'evidenziazione della sintassi in un solo buffer.

L' autocmd BufReadPreera un po 'di una falsa pista. syntax off funziona nel BufReadPrecontesto ma non nel Filetypecontesto (e ovviamente disabilita la sintassi a livello globale); mentre setlocal syntax=OFFlo fa , non lavoro nel BufReadPrecontesto, ma opera nel Filetypecontesto.


1

Questo autocmd BufReadPre * if getfsize(expand("%")) > 10000000 | syntax off | endifè quello che ti serve.


2
Hmm, questo disabilita l'evidenziazione della sintassi, ma in tutti i buffer, non solo quello con il file di grandi dimensioni. Inoltre &ftsembra non essere impostato in questo contesto, quindi non so come limitarlo solo ai file XML. Qualche idea?
l4mpi,

Penso che tu voglia set syntax=OFFinvece. (O dovrebbe essere ambientato?)
derobert

potresti provare syntax clearallora?
Dhruva Sagar,

@derobert setlocal syntax=OFFfunziona, anche se non con BufReadPre *- ho dovuto cambiare il comando automatico Filetype xmlper questo. Sembra che non sia banale quali comandi funzionano in quali contesti di autocommand ...
l4mpi
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.