Подтвердить что ты не робот

Выделение синтаксиса вызывает ужасное отставание в Vim

Я люблю Вима. Но это дает мне тяжелые времена прямо сейчас.

Я использую много плагинов, и в течение последних 6 месяцев я нашел много потрясающих. Но мой Vim тоже очень вялый. Я выполняю постоянную очистку, но это мало помогает.

Я нахожусь в точке, где Vim полностью непригодна для использования. Похоже, что он отображает со скоростью 2-5 кадров в секунду, переключение вкладок/буферов занимает около секунды, прокрутка с помощью hjkl ужасно ужасна, отставание настолько плохое, что даже ввод предложения в режиме вставки запутан (из-за задержки).

Изменить: На самом деле, когда я открываю новый экземпляр Vim, его OK-ish, но не в течение 15 минут он становится непригодным.

Я только что провел 4 часа, пытаясь выяснить, какой плагин или конфир вызывает боль. Я не увенчался успехом.

Однако, я выяснил, что удаление этой настройки приводит к тому, что все задержки отстают: syntax on

Эти 3 строки в сочетании с синтаксисом делают все еще хуже.

set t_Co=256
set background=dark
colorscheme candyman

Интересно. Итак, подсветка синтаксиса превращает Vim из супер-мгновенного в невероятно вялое?

Я попробовал включить синтаксис в "чистом" режиме: vim -u NONE

И это не проблема.

Так что, похоже, проблема заключается в синтаксическом освещении в сочетании с одним или несколькими моими плагинами. Я попробовал отключить кучу, не повезло.

Есть ли способ сделать профилирование? Я довольно устал от ручного тестирования.

У кого-нибудь был подобный опыт? Возможно, быстро загляните в мой .vimrc, посмотрите, звонит ли звонок. https://bitbucket.org/furion/dotfiles

РЕШЕНИЕ: Плагин вызывает беспорядок:

Bundle "gorodinskiy/vim-coloresque.git"

Я рекомендую прочитать ответы, хорошие идеи.

Изменить (1 месяц спустя): В плагине coloresque появились некоторые улучшения.

4b9b3361

Ответ 1

У вас есть спам autocmd. Вы должны обернуть все ваши заявления autocmd группами, которые очищают группу до повторного добавления автозаписей. Похоже, что ваш .vimrc имеет большинство автозаписей, так что, возможно, есть плагин, который вызывает проблему. Проверьте вывод этой команды:

:au CursorMoved

Если там есть куча дубликатов обработчиков, это ваша проблема.

Вот пример дисциплины autocmd из my.vimrc:

augroup vimrc_autocmd
  autocmd!
  "toggle quickfix window
  autocmd BufReadPost quickfix map <buffer> <leader>qq :cclose<cr>|map <buffer> <c-p> <up>|map <buffer> <c-n> <down>

  autocmd FileType unite call s:unite_settings()
  " obliterate unite buffers (marks especially).
  autocmd BufLeave \[unite\]* if "nofile" ==# &buftype | setlocal bufhidden=wipe | endif

  " Jump to the last position when reopening a file
  autocmd BufReadPost * if line("'\"") > 1 && line("'\"") <= line("$") | exe "normal! g`\"" | endif

  " ...etc...

augroup END

autocmd! в начале блока augroup очищает текущую группу (vimrc_autocmd в этом случае) перед повторным добавлением автозаписей.

Ответ 2

:syntime on

перемещайтесь в своем рубиновом файле, а затем

:syntime report

Сообщалось о следующем медленном совпадении для меня, и вы можете видеть, что нет даже одного совпадения.

Я отключил rubyPredefinedConstant в файле ruby.vim и проблема решена. Vime regex engine не нравится что-то в рубиновом синтаксисе подсветки регулярного выражения. Вам нужно будет найти баланс между достаточным количеством синтаксиса и хорошей производительностью.

Надеюсь, что это поможет, вот три самых медленных синтаксиса, выделяющих регулярное выражение для рубинов, сообщаемых на моей Mac OS 10.8.5, homebrew Vim 7.4 (консольный vim)

    TOTAL      COUNT  MATCH   SLOWEST     AVERAGE   NAME               PATTERN
  3.498505   12494  0       0.008359    0.000280  rubyPredefinedConstant \%(\%(\.\@<!\.\)\@<!\|::\)\_s*\zs\%(STDERR\|STDIN\|STDOUT\|TOPLEVEL_BINDING\|TRUE\)\>\%(\s*(\)\@!
  2.948513   12494  0       0.006798    0.000236  rubyPredefinedConstant \%(\%(\.\@<!\.\)\@<!\|::\)\_s*\zs\%(MatchingData\|ARGF\|ARGV\|ENV\)\>\%(\s*(\)\@!
  2.438253   12494  0       0.005346    0.000195  rubyPredefinedConstant \%(\%(\.\@<!\.\)\@<!\|::\)\_s*\zs\%(DATA\|FALSE\|NIL\)\>\%(\s*(\)\@!

Или вы можете попробовать vim-ruby, как указано Dojosto

Ответ 3

Из другого вопроса о переполнении стека, я быстро получаю vim, добавив следующую строку в файл .vimrc:
set re=1
Это заставит vim использовать более раннюю версию regex engine, и она фактически является FASTER для ruby.

Ответ 4

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

Я начал с новой установки Vim. Я добавил плагин плагином, пока не нашел корень всего зла.

Bundle "gorodinskiy/vim-coloresque.git"

Его плагин, который вызывал у меня всю эту боль. Поскольку у меня это было какое-то время, это не было подозреваемым, поэтому я обнаружил это так поздно. Что делает этот плагин, когда он находит слово для цвета (например, красного, зеленого) или шестнадцатеричного значения (например, #FFFFFF), он устанавливает цвет фона текста в соответствии с цветом, который он описывает. Блестящая идея, но похоже на плохую реализацию.

Удаление этого плагина устраняет задержки.

Но я не остановился здесь. Я также сделал большую очистку от моего .vimrc. Удалено еще несколько плагинов, которые я не использовал. Сгруппировал мой autocmd и удалил ненужные.

Мой Vim очень злобный. Я снова счастлив.

Ответ 5

Я обнаружил, что "set foldmethod = syntax" делает 7.4 почти непригодным для медленного, например. для js & ruby файлов (ubuntu 13.10), тогда как "set foldmethod = indent" отлично работает.

Ответ 6

Я заметил, что vim может замедлить работу, если вы используете что-либо, что динамически меняет цвет фона. Попробуйте отключить :set cursorline или :set cursorcolumn (если вы их установили).

Ответ 7

Я уверен, что

set t_Co=256
set background=dark
colorscheme candyman

не имеют ничего общего с этим отставанием. Две первые строки бесполезны (количество используемых цветов определяется в соответствии с вашим $TERM, а ваша цветовая схема уже делает set background=dark), но не очень вредна.

В общем случае "Vim замедляется до сканирования" причины включают плохо написанные autocmd s, слишком много autocmd s, слишком часто перезагружая один ~/.vimrc, плохо написанные плагины...

Пожалуйста, разместите свою настройку, чтобы мы могли помочь вам узнать, почему вы испытываете это отставание.

Ответ 8

Выделение синтаксиса может быть медленным, но это должно быть ограничено некоторыми (несколько патологическими) файлами и конкретными синтаксисами. В последней версии Vim 7.4 есть новая команда :syntime для устранения неполадок подсветки синтаксиса.

Кроме того, часто, бинарный поиск, где вы отключите половину своих плагинов, тогда только одна половина из них (когда проблема все еще существует), или другая половина (когда проблема исчезла) позволяет вам добраться до проблематично script быстро.

Ответ 9

У меня была эта проблема в течение долгого времени, и это сводило меня с ума. Я попытался установить vim-ruby. Не уверен, что это помогло, но по крайней мере сейчас у меня есть самая современная версия подсветки синтаксиса ruby ​​(с любыми улучшениями производительности, поскольку была выпущена последняя версия Vim).

Но потом я посмотрел дальше и обнаружил, что vim-ruby имеет режим, который пропускает все дорогие выделения. Попробуйте добавить эту строку в свой vimrc и посмотреть, помогает ли она (это было для меня, наконец!):

let ruby_no_expensive=1