Deaktivieren Sie die Syntaxhervorhebung je nach Dateigröße und -typ

16

Ich muss häufig verschiedene XML-Dateien mit vim bearbeiten, die sich in ihrer Größe stark unterscheiden - von Konfigurationsdateien mit einigen hundert Zeilen bis hin zu Produktionsdatendateien mit einer Größe von bis zu 2 GB. Die Syntax-Hervorhebung zu aktivieren ist natürlich eine sehr schlechte Idee, wenn es um große Dateien geht. Daher möchte ich sie deaktivieren, wenn die Datei größer als ein Schwellenwert ist.

Ich konnte dies nicht autocommanddirekt zum Deaktivieren der Syntaxhervorhebung verwenden, da der Befehl anscheinend ausgeführt wird, bevor die Syntax aktiviert wird, wenn vim von der Shell aus gestartet wird:

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

Ich habe eine Problemumgehung gefunden, indem ich die Syntaxhervorhebung global deaktivieren und sie dann für alle anderen Dateitypen als xml wieder aktivieren und für den Dateityp xml aktivieren kann, wenn die Datei nicht größer als der Schwellenwert ist:

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

Dies scheint zu funktionieren, fühlt sich aber falsch an und wird nicht mehr zu handhaben sein, wenn ich dies für mehr Dateitypen und Bedingungen tun möchte. Außerdem beeinflusst es alle Puffer. Wie kann die Syntaxhervorhebung in einem Puffer unter bestimmten Bedingungen ordnungsgemäß deaktiviert werden?

l4mpi
quelle
Obwohl dieses Q gut geschrieben ist, scheint es im Großen und Ganzen den gleichen Grund (in der Tat eine Teilmenge) zu umfassen: vi.stackexchange.com/questions/149/…
Andrew Ferrier
4
@ AndrewFerrier Ich würde dagegen argumentieren. Die andere Frage betrifft allgemeine Tipps zum Umgang mit großen Dateien. Bei mir geht es darum , ein bestimmtes Puzzleteil unter bestimmten Einschränkungen zu implementieren. Vergleichen Sie einfach die Antworten - die Antworten auf die andere Frage sagen mir, dass ich die Syntax deaktivieren soll, aber nicht, wie ich dies dynamisch in einem einzelnen Puffer für einen einzelnen Dateityp tun soll. Somit wird es mein weitaus spezifischeres Problem nicht lösen. Sie sind verwandt, aber keine Duplikate, da sie nach unterschiedlichen Dingen fragen und zu unterschiedlichen Antworten führen.
14.
l4mpi, das ist ein fairer Punkt, ich hatte das Dateiformat auch nicht entdeckt. Testen Sie hier nur teilweise das Wasser der neuen Beta! Punkt genommen. Ich werde meine doppelte Stimme zurückziehen.
Andrew Ferrier

Antworten:

11

Dieser Kommentar von derobert führte mich zur Lösung:

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

Dies scheint die Syntaxhervorhebung in nur einem Puffer zuverlässig zu deaktivieren.

Das autocmd BufReadPrewar ein bisschen wie ein roter Hering. syntax off funktioniert im BufReadPreKontext, aber nicht im FiletypeKontext (und deaktiviert natürlich die Syntax global); while setlocal syntax=OFFfunktioniert nicht im BufReadPreKontext, sondern im FiletypeKontext.

l4mpi
quelle
1

Das autocmd BufReadPre * if getfsize(expand("%")) > 10000000 | syntax off | endifist was du brauchst.

Dhruva Sagar
quelle
2
Hmm, dies deaktiviert die Syntaxhervorhebung, aber in allen Puffern, nicht nur in dem mit der großen Datei. Außerdem &ftscheint in diesem Zusammenhang nicht festgelegt zu sein, so dass ich nicht weiß, wie ich es nur auf XML-Dateien beschränken kann. Irgendwelche Ideen?
14.
Ich denke du willst set syntax=OFFstattdessen. (Oder sollte das setlocal sein?)
Derobert
möchten Sie vielleicht versuchen, syntax cleardann vielleicht?
Dhruva Sagar,
@derobert setlocal syntax=OFFfunktioniert, wenn auch nicht mit BufReadPre *- ich musste dafür den autocommand wieder auf umstellen Filetype xml. Scheint , wie es nicht trivial ist , das Werk , in dem Befehl Kontexte automatischen Befehl ...
l4mpi