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 autocommand
bezpoś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?
źródło
Odpowiedzi:
Ten komentarz przez derobert doprowadziło mnie do rozwiązania:
Wydaje się, że niezawodnie wyłącza podświetlanie składni tylko w jednym buforze.
To
autocmd BufReadPre
było trochę czerwonego śledzia.syntax off
działa wBufReadPre
kontekście, ale nie wFiletype
kontekście (i oczywiście wyłącza składnię globalnie); podczas gdysetlocal syntax=OFF
nie nie pracy wBufReadPre
kontekście, ale działa wFiletype
kontekście.źródło
Właśnie
autocmd BufReadPre * if getfsize(expand("%")) > 10000000 | syntax off | endif
tego potrzebujesz.źródło
&ft
wydaje się, że nie jest ustawiony w tym kontekście, więc nie wiem, jak ograniczyć go tylko do plików XML. Jakieś pomysły?set syntax=OFF
zamiast tego chcesz . (A może powinno to być rozstrzygnięte?)syntax clear
?setlocal syntax=OFF
działa, choć nie zBufReadPre *
- 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 ...