Vim медленно рендерит буфер с подсветкой синтаксиса LaTeX
После устранения ошибки жесткого диска я устанавливаю GVIM на свой ноутбук Thinkpad X230T под управлением Windows 10. Все работает хорошо, за исключением скорости восстановления буферов для *.tex
файлы. Проблема: с syntax on
, буфер латекса рендерится исключительно медленно. Вот список "функций":
- Обновление буфера размером 1920*1080 (в пикселях) занимает несколько секунд, когда я нажимаю
<C-f>
; - Если я уменьшу размер буфера, рендеринг станет быстрее. Тем не менее, я буду испытывать второе отставание как минимум. Во время задержки я вижу только пустой буфер.
- Текстовые операции также медленные. Просто начните новую строку ниже, нажав
o
также заканчивается задержкой в одну секунду. Во многом это связано с рендерингом всего буфера после добавления этой единственной строки: все последующие строки должны быть обновлены для их "новой" позиции.
В качестве примера скринкаста:
Я применил все предложенные варианты, упомянутые в этом посте ( https://stackoverflow.com/questions/8300982/vim-slow-running-latex-files), но при этом все равно получаю ту же медленную скорость рендеринга.
Я испытывал только это исключительное замедление на моем X230T. С точно таким же _vimrc
на двух других настольных компьютерах я даже не испытываю незначительного отставания в скорости рендеринга. Я также не испытывал проблемы с рендерингом при предыдущей установке Windows 7 и 8 на тот же ноутбук X230T.
Наконец, для жесткого диска у меня есть XD30 на моем X230T, который до сих пор работал довольно хорошо; и у меня есть HDD на двух других настольных компьютерах.
Любой совет будет очень полезным!
Большое спасибо!
Всего наилучшего,
-Linfeng
3 ответа
Проблема в том, что механизм регулярных выражений vim очень медленный, и я думаю, что латекс довольно требователен к регулярным выражениям.
Я смог получить VIM немного быстрее, выполнив:
:syn clear texSectionFold
:syn clear texPreamble
Это были основные синтаксические регулярные выражения группы.
Я нашел их, сделав:
:syntime on
Теперь нажмите ctrl+L
тонну раз и жди, когда Вим догонит. Затем:
:syntime report
Это дало следующий вывод:
TOTAL COUNT MATCH SLOWEST AVERAGE NAME PATTERN
8.903872 1911 52 0.017387 0.004659 texSectionFold \v%(%(\\begin\{document\}.*$\n)@<=^|\\section)
4.979438 1859 0 0.016382 0.002679 texPreamble \v%(\\documentclass)@=
0.634906 1976 182 0.010863 0.000321 texEnvName \v%(\\%(begin|end)\{)@<=\a+\*?\ze\}
0.373173 1859 0 0.000880 0.000201 texArgsEnvNormReq \v(\\begin\{%(theorem|lemma|proposition|corollary|conjecture|definition|remark|example|proof)\*?\}\s*)@<=\{
0.317732 1859 0 0.000468 0.000171 texArgsEnvNormOpt \v(\\begin\{%(theorem|lemma|proposition|corollary|conjecture|definition|remark|example|proof)\*?\}\s*)@<=\[
0.223595 1859 0 0.000341 0.000120 texDimen \v-?%(\.[0-9]+|([0-9]+(\.[0-9]+)?))%(pt|pc|bp|in|cm|mm|dd|cc|sp|ex|em)>
...
Таким образом, вы можете видеть, что эти два регулярных выражения намного дороже, чем другие. Я не использую складки, поэтому у меня не было проблем с отключением этого. Не уверен, почему найти преамбулу так медленно.
Возможно, это вам тоже поможет, @llinfeng. Я надеюсь, что это так!
РЕДАКТИРОВАТЬ:
Чтобы запустить те syn clear
Команды, когда Vim запускается, вам нужно поместить их в ~/.vim/after/syntax/tex.vim
, Это не будет работать в ftplugin
файл, так как определения синтаксиса еще не загружены в этот момент.
EDIT2:
Оказывается, некоторые из синтаксических групп, которые я выложил выше, взяты из плагина. Отключение плагина не помогает, так как некоторые другие группы синтаксиса работают медленно. Eesh!
Мое окончательное исправление, и все, что я прошу из выделения синтаксиса, это:
$ cat ~/.vim/after/syntax/tex.vim
syn clear
syn match texComment "%.*$"
hi def link texComment Comment
Это действительно быстро.
Вы использовали vim -u NONE filename.tex
при открытии файла отключить .vimrc
и другие сценарии загрузки для сеанса, и это устранило проблему.
Вывод заключается в том, что что-то началось .vimrc
файл вызывает замедление.
Попробуйте выборочно удалить части файла, чтобы выяснить, в чем именно причина. Не забудьте взять резервную копию.
Частичное решение для Thinkapd X230T само по себе
Идентификация проблемы
Как подсказал @Edd, используйте :syntime on
а также syntime report
определить наиболее трудоемкую подсветку синтаксиса "группа / регион / совпадение"';
Частичное решение
Как найти в следующем URL, я загрузил tex.vim
в after
каталог моего дистрибутива Vim (c:\vim\vimfiles\after\syntax\
для моего случая)
https://github.com/llinfeng/Vim/blob/X230T/vimfiles/after/syntax/tex.vim
результат
Используя тот же файл LaTeX, моя улучшенная производительность выглядит следующим образом
Открытый вопрос --- как эффективно воспроизвести подсветку синтаксиса
Раскраска синтаксиса не идеальна по сравнению с нативной tex.vim
быть найденным как c:\vim\vim80\syntax\tex.vim
,