Wyłącz podświetlanie składni w zależności od rozmiaru i typu pliku

16

Często muszę edytować różne pliki XML za pomocą vima, które różnią się ogromnie rozmiarem - od plików konfiguracyjnych zawierających kilka setek linii po pliki danych produkcyjnych o rozmiarach do 2 GB. Włączanie podświetlania składni jest oczywiście bardzo złym pomysłem w przypadku dużych plików, dlatego chcę je wyłączyć, jeśli plik jest większy niż próg.

Nie mogłem tego uruchomić, używając autocommandbezpośrednio do wyłączania podświetlania składni, ponieważ najwyraźniej polecenie jest wykonywane przed włączeniem składni podczas uruchamiania vima z powłoki:

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

Znalazłem obejście polegające na tym, że mogę wyłączyć globalne podświetlanie składni, a następnie włączyć je ponownie dla wszystkich typów plików innych niż xml i włączyć dla typu pliku xml, jeśli plik nie jest większy niż próg:

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

Wydaje się, że to działa, ale wydaje się złe i stanie się niemożliwe do zarządzania, gdy chcę to zrobić dla większej liczby typów plików i warunków. Ponadto wpływa na wszystkie bufory. Jaki jest właściwy sposób wyłączenia podświetlania składni w jednym buforze w określonych warunkach?

l4mpi
źródło
Chociaż to Q jest dobrze napisane, wydaje się, że obejmuje zasadniczo ten sam grunt (w rzeczywistości podzbiór) tego: vi.stackexchange.com/questions/149/…
Andrew Ferrier
4
@AndrewFerrier Sprzeciwiłbym się temu. Drugie pytanie dotyczy ogólnych wskazówek dotyczących obsługi dużych plików. Mój polega na wdrożeniu jednego raczej konkretnego elementu układanki w ramach danego zestawu ograniczeń. Po prostu porównaj odpowiedzi - odpowiedzi na inne pytanie podpowiedzą mi o wyłączeniu składni, ale nie o tym, jak to zrobić dynamicznie w jednym buforze dla jednego typu pliku. W ten sposób nie rozwiąże mojego o wiele bardziej szczegółowego problemu. Są powiązane, ale nie duplikaty, ponieważ proszą o różne rzeczy i prowadzą do różnych odpowiedzi.
l4mpi
l4mpi, to słuszna kwestia, nie zauważyłem też rodzaju pliku. Tylko częściowo testuję wody nowej wersji beta! Punkt wzięty. Wycofam mój duplikat głosu.
Andrew Ferrier,

Odpowiedzi:

11

Ten komentarz przez derobert doprowadziło mnie do rozwiązania:

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

Wydaje się, że niezawodnie wyłącza podświetlanie składni tylko w jednym buforze.

To autocmd BufReadPrebyło trochę czerwonego śledzia. syntax off działa w BufReadPrekontekście, ale nie w Filetypekontekście (i oczywiście wyłącza składnię globalnie); podczas gdy setlocal syntax=OFFnie nie pracy w BufReadPrekontekście, ale działa w Filetypekontekście.

l4mpi
źródło
1

Właśnie autocmd BufReadPre * if getfsize(expand("%")) > 10000000 | syntax off | endiftego potrzebujesz.

Dhruva Sagar
źródło
2
Hmm, to wyłącza podświetlanie składni, ale we wszystkich buforach, nie tylko w tym z dużym plikiem. Ponadto &ftwydaje się, że nie jest ustawiony w tym kontekście, więc nie wiem, jak ograniczyć go tylko do plików XML. Jakieś pomysły?
l4mpi
Myślę, że set syntax=OFFzamiast tego chcesz . (A może powinno to być rozstrzygnięte?)
derobert
może chcesz spróbować syntax clear?
Dhruva Sagar
@derobert setlocal syntax=OFFdziała, choć nie z BufReadPre *- musiałem w tym celu zmienić automatyczną komendę Filetype xml. Wygląda na to, że nietrudne jest, które komendy działają w kontekstach automatycznego polecenia ...
l4mpi