Отключить подсветку синтаксиса в зависимости от размера и типа файла

16

Мне часто приходится редактировать различные 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

Кажется, это работает, но кажется неправильным и станет неуправляемым, когда я захочу сделать это для большего количества типов файлов и условий. Кроме того, это влияет на все буферы. Как правильно отключить подсветку синтаксиса в одном буфере при определенных условиях?

l4mpi
источник
Хотя этот Q хорошо написан, он, кажется, охватывает в общих чертах ту же основу (фактически, подмножество) этого: vi.stackexchange.com/questions/149/…
Эндрю Ферье
4
@AndrewFerrier Я бы поспорил с этим. Другой вопрос касается общих советов по работе с большими файлами. Моя задача - реализовать одну довольно специфическую часть головоломки под заданным набором ограничений. Просто сравните ответы - ответы на другой вопрос скажут мне отключить синтаксис, но не как это сделать динамически в одном буфере для одного типа файла. Таким образом, это не решит мою гораздо более конкретную проблему. Они связаны, но не дублируют друг друга, поскольку просят разные вещи и приводят к разным ответам.
15
l4mpi, это справедливо, я тоже не заметил, что такое тип файла. Просто тестирование воды новой беты здесь частично! Дело принято. Я заберу свой повторный голос.
Эндрю Ферье

Ответы:

11

Этот комментарий по derobert привело меня к решению:

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

Кажется, это надежно отключает подсветку синтаксиса только в одном буфере.

Это autocmd BufReadPreбыло немного красной сельди. syntax off работает в BufReadPreконтексте, но не в Filetypeконтексте (и, конечно, отключает синтаксис глобально); в то время как setlocal syntax=OFFделает не работать в BufReadPreконтексте , но работает в Filetypeконтексте.

l4mpi
источник
1

Это autocmd BufReadPre * if getfsize(expand("%")) > 10000000 | syntax off | endifто, что вам нужно.

Дхрува Сагар
источник
2
Хм, это отключает подсветку синтаксиса, но во всех буферах, а не только в том, что содержит большой файл. Кроме того, &ftкажется, не устанавливается в этом контексте, поэтому я не знаю, как ограничить его только для файлов XML. Есть идеи?
14
Я думаю, что вы хотите set syntax=OFFвместо этого. (Или это должно быть setlocal?)
Дероберт
Вы можете попробовать syntax clearтогда, может быть?
Дхрува Сагар
@derobert setlocal syntax=OFFработает, хотя не с BufReadPre *- мне пришлось изменить автокоманду обратно Filetype xmlдля этого. Похоже, нетривиально, какие команды работают, в каких контекстах
автокоманд