Désactiver la coloration syntaxique en fonction de la taille et du type de fichier

16

Je dois souvent éditer divers fichiers XML avec vim, dont la taille varie énormément - des fichiers de configuration contenant quelques lignes hunded aux fichiers de données de production avec des tailles allant jusqu'à 2 Go. L'activation de la coloration syntaxique est bien sûr une très mauvaise idée lorsque vous traitez des fichiers volumineux, donc je veux la désactiver si le fichier est plus grand qu'un seuil.

Je n'ai pas pu faire fonctionner cela en utilisant autocommanddirectement pour désactiver la mise en évidence de la syntaxe, car apparemment, la commande est exécutée avant que la syntaxe ne soit activée lors du démarrage de vim à partir du shell:

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

J'ai trouvé une solution de contournement en ce sens que je peux désactiver la mise en évidence de la syntaxe à l'échelle mondiale, puis la réactiver pour tous les autres types de fichiers que xml et l'activer pour le type de fichier xml si le fichier n'est pas plus grand que le seuil:

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

Cela semble fonctionner, mais se sent mal et deviendra ingérable une fois que je veux le faire pour plus de types de fichiers et de conditions. De plus, il influence tous les tampons. Quelle est la bonne façon de désactiver la mise en évidence de la syntaxe dans un tampon dans des conditions spécifiques?

l4mpi
la source
Bien que ce Q soit bien écrit, il semble couvrir largement le même terrain (en fait, un sous-ensemble) de celui-ci: vi.stackexchange.com/questions/149/…
Andrew Ferrier
4
@AndrewFerrier, je m'opposerais à cela. L'autre question concerne les conseils généraux pour gérer les gros fichiers. Le mien consiste à implémenter une pièce plutôt spécifique du puzzle sous un ensemble donné de restrictions. Comparez simplement les réponses - les réponses à l'autre question me diront de désactiver la syntaxe, mais pas comment le faire dynamiquement dans un seul tampon pour un seul type de fichier. Cela ne résoudra donc pas mon problème bien plus spécifique. Ils sont liés mais pas en double car ils demandent des choses différentes et conduisent à des réponses différentes.
l4mpi
l4mpi, c'est un bon point, je n'avais pas repéré la chose de type de fichier aussi. Je teste partiellement les eaux de la nouvelle version bêta ici! Point pris. Je retire mon double vote.
Andrew Ferrier

Réponses:

11

Ce commentaire de derobert m'a conduit à la solution:

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

Cela semble désactiver de manière fiable la mise en évidence de la syntaxe dans un seul tampon.

Le autocmd BufReadPreétait un peu d'un hareng saur. syntax off fonctionne dans le BufReadPrecontexte mais pas dans le Filetypecontexte (et bien sûr désactive la syntaxe globalement); while setlocal syntax=OFFne fonctionne pas dans le BufReadPrecontexte mais fonctionne dans le Filetypecontexte.

l4mpi
la source
1

Voilà autocmd BufReadPre * if getfsize(expand("%")) > 10000000 | syntax off | endifce dont vous avez besoin.

Dhruva Sagar
la source
2
Hmm, cela désactive la mise en évidence de la syntaxe, mais dans tous les tampons, pas seulement celui avec le gros fichier. De plus, &ftne semble pas être défini dans ce contexte, donc je ne sais pas comment le limiter aux fichiers xml uniquement. Des idées?
l4mpi
Je pense que tu veux set syntax=OFFplutôt. (Ou cela devrait-il être
réglé localement
vous voudrez peut-être essayer syntax clearalors peut-être?
Dhruva Sagar
@derobert setlocal syntax=OFFfonctionne, mais pas avec BufReadPre *- j'ai dû changer la commande automatique Filetype xmlpour cela. Il semble que ce ne soit pas trivial, les commandes fonctionnent dans quels contextes de commande
automatique