Вимкнути підсвічування синтаксису залежно від розміру та типу файлу


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

Це, здається, працює, але почувається неправильним і стане некерованим, як тільки я захочу це зробити для інших типів файлів та умов. Крім того, він впливає на всі буфери. Який правильний спосіб відключити виділення синтаксису в одному буфері за конкретних умов?



Хоча цей Q добре написаний, він, схоже, охоплює таку саму основу (насправді, підмножину) цього: vi.stackexchange.com/questions/149/…
Ендрю Фер'єр

4
@AndrewFerrier Я б заперечував проти цього. Інше питання стосується загальних порад щодо обробки великих файлів. Моє - це реалізація однієї досить конкретної частини головоломки під заданим набором обмежень. Просто порівняйте відповіді - відповіді на інше питання підкажуть мені вимкнути синтаксис, але не як це зробити динамічно в одному буфері для одного типу файлів. Таким чином, це не вирішить мою куди більш конкретну проблему. Вони пов'язані, але не дублікати, оскільки вони просять різні речі та призводять до різних відповідей.
l4mpi

l4mpi, це справедливий момент, я теж не помітив річ з філейтипом. Просто частково випробовуйте води нової бета-версії! Точка взята. Я відкликаю свій дублікат.
Ендрю Фер’єр

Відповіді:


11

Цей коментар по derobert привело мене до висновку:

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

Здається, це надійно відключить виділення синтаксису лише в одному буфері.

Це autocmd BufReadPreбула трохи червона оселедець. syntax off працює в BufReadPreконтексті, але не в Filetypeконтексті (і звичайно вимикає синтаксис в усьому світі); в той час як setlocal syntax=OFFробить НЕ працювати в BufReadPreконтексті , але працює в Filetypeконтексті.


1

Це autocmd BufReadPre * if getfsize(expand("%")) > 10000000 | syntax off | endifте, що вам потрібно.


2
Гм, це вимикає підсвічування синтаксису, але у всіх буферах, не лише у великому файлі. Крім того, &ftсхоже, це не встановлено в цьому контексті, тому я не знаю, як обмежити його лише файлами xml. Будь-які ідеї?
l4mpi

Я думаю, що ти хочеш set syntax=OFFзамість цього. (Або це має бути місцевим?)
derobert

ви можете спробувати syntax clearтоді, можливо?
Дхрува Сагар

@derobert setlocal syntax=OFFпрацює, хоча і не з цим BufReadPre *- для цього мені довелося змінити автокоманду Filetype xml. Здається, це нетривіально, які команди працюють, в яких автокоманда контекстує ...
l4mpi
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.