Мне часто приходится редактировать различные XML-файлы с помощью vim, которые сильно различаются по размеру - от файлов конфигурации, содержащих несколько строк, до файлов рабочих данных размером до 2 ГБ. Включение подсветки синтаксиса, конечно, очень плохая идея при работе с большими файлами, поэтому я хочу отключить его, если файл больше порога.
Я не мог заставить это работать, используя autocommand
напрямую, чтобы отключить подсветку синтаксиса, так как, очевидно, команда выполняется перед включением синтаксиса при запуске vim из оболочки:
" this autocmd has no effect except for the echo:
autocmd Filetype xml if getfsize(@%) > 1000000 | echom '!' | syntax off | endif
Я нашел обходной путь в том, что я могу отключить подсветку синтаксиса глобально, затем снова включить его для всех других типов файлов, кроме xml, и включить его для типа файлов xml, если файл не превышает пороговое значение:
syntax off
autocmd Filetype * syntax off
autocmd Filetype * if &ft != 'xml' | syntax enable | endif
autocmd Filetype xml if getfsize(@%) < 1000000 | syntax enable | endif
Кажется, это работает, но кажется неправильным и станет неуправляемым, когда я захочу сделать это для большего количества типов файлов и условий. Кроме того, это влияет на все буферы. Как правильно отключить подсветку синтаксиса в одном буфере при определенных условиях?
Ответы:
Этот комментарий по derobert привело меня к решению:
Кажется, это надежно отключает подсветку синтаксиса только в одном буфере.
Это
autocmd BufReadPre
было немного красной сельди.syntax off
работает вBufReadPre
контексте, но не вFiletype
контексте (и, конечно, отключает синтаксис глобально); в то время какsetlocal syntax=OFF
делает не работать вBufReadPre
контексте , но работает вFiletype
контексте.источник
Это
autocmd BufReadPre * if getfsize(expand("%")) > 10000000 | syntax off | endif
то, что вам нужно.источник
&ft
кажется, не устанавливается в этом контексте, поэтому я не знаю, как ограничить его только для файлов XML. Есть идеи?set syntax=OFF
вместо этого. (Или это должно быть setlocal?)syntax clear
тогда, может быть?setlocal syntax=OFF
работает, хотя не сBufReadPre *
- мне пришлось изменить автокоманду обратноFiletype xml
для этого. Похоже, нетривиально, какие команды работают, в каких контекстах