Vim медленно рендерит буфер с подсветкой синтаксиса LaTeX

После устранения ошибки жесткого диска я устанавливаю GVIM на свой ноутбук Thinkpad X230T под управлением Windows 10. Все работает хорошо, за исключением скорости восстановления буферов для *.tex файлы. Проблема: с syntax on, буфер латекса рендерится исключительно медленно. Вот список "функций":

  1. Обновление буфера размером 1920*1080 (в пикселях) занимает несколько секунд, когда я нажимаю <C-f>;
  2. Если я уменьшу размер буфера, рендеринг станет быстрее. Тем не менее, я буду испытывать второе отставание как минимум. Во время задержки я вижу только пустой буфер.
  3. Текстовые операции также медленные. Просто начните новую строку ниже, нажав 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,

Другие вопросы по тегам