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?



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.


1

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


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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.