2013-09-26 2 views
42

Я люблю Vim. Но это дало мне тяжелые времена прямо сейчас.Синтаксическая подсветка вызывает ужасное отставание в 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 видел некоторые улучшения.

+0

Основываясь на вашей последней редакции, я предполагаю, что что-то что-то просачивается. Вы видите, что объем памяти vim растет (даже слегка, но постоянно)? Это может быть, например, плагин или даже vim, который хранит карту тех вещей, которая постоянно растет, либо из-за того, что плагин является ошибкой, либо вы установили некоторые настройки в Vim на действительно большое значение (дикая догадка, но, например, отменить история). – Shahbaz

+0

Другой способ, как я могу сразу запустить lagg, - это перейти в .vimrc и 'so%' it. Как я могу проверить наличие утечек? –

+0

Я действительно не знаю. Похоже, что перезагрузка плагина вызывает утечку? Скорее всего, вам нужно подождать [этого парня] (http://stackoverflow.com/users/813602/ingo-karkat), чтобы ответить вам! – Shahbaz

ответ

18

У вас есть 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, в данном случае) перед повторным добавлением autocmds.

+0

3 автокоманды от ': au CursorMoved'. Все 3 из плагинов. Я переработаю свой '.vimrc', чтобы следовать вашей дисциплине. –

+2

... или не перезагружайте .vimrc, просто ': q' и перезапустите. –

+0

@JanNetherdrake 3 autocommads не так уж плохо, но, возможно, один из них ведет себя плохо. Вы можете, по крайней мере, очистить autocmds 'CursorMoved' через эту команду:': au! CursorMoved', чтобы узнать, разрешает ли это проблема. Это позволяет сузить проблему. –

4

Я уверен, что

set t_Co=256 
set background=dark 
colorscheme candyman 

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

Common «Вьет замедляемся к ползанию» причины включают плохо написанные autocmd с, слишком много autocmd с, перегрузочным своими ~/.vimrc слишком часто, плохо написанными плагиными ...

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

+0

Я отправил свою настройку, если вы ее пропустили, ее на нижней части сообщения. –

+0

Извините. Я бы сказал, что у вас слишком много autocmds. Попробуйте прокомментировать их, чтобы узнать, сохраняется ли проблема. – romainl

4

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

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

8

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

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

Bundle "gorodinskiy/vim-coloresque.git" 

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

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

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

My Vim очень быстро. Я снова счастлив.

+1

Я никогда не слышал об этом плагине, но я искал что-то вроде этого. В конце концов я нашел https://github.com/chrisbra/color_highlight, что, вероятно, является лучшей реализацией (Кристиан Брабандт сделал исправления для самого Vim, поэтому я предполагаю, что он знает, как писать хорошо продуманный плагин) –

+1

Я не мог помогите себе, я просто проверил [источник] (https://github.com/gorodinskiy/vim-coloresque/blob/master/after/syntax/css/vim-coloresque.vim), и, действительно, плагин добавляет дорогой 'CursorMoved' autocmd, и это не предотвращает дублирование регистрации. –

+0

Спасибо за все! –

8

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

+1

[Плагин FastFold] (https://github.com/Konfekt/FastFold) делает так, что складки пересчитываются только при сохранении. См. Http://stackoverflow.com/a/26812154/79125 – idbrii

+0

Спасибо, ты спас мой день! – Lucas

+0

Ничего себе, какое улучшение! Vim можно использовать в больших файлах снова, даже со всеми моими плагинами. Спасибо! – mwp

69
:syntime on 

двигаться вокруг в файле рубин, а затем

:syntime report 

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

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

надежда, что помогает, вот верх 3 медленный подсветка синтаксиса регулярных выражений для рубина сообщил на моем Mac OS 10.8.5, доморощенный 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 как указывалось by Dojosto

+1

+1. Ответ на вопрос. Ну, а не _life_saving. Но у меня был 100-строчный файл '.rb', который загружался, как это было 100 миллионов строк, и отключение« rubyPrefinedConstant »сделало трюк. Спасибо @AskandLearn! –

+0

Не могли бы вы объяснить, как вы это сделали? Где я должен поместить ruby.vim и какой код я должен использовать в этом файле, чтобы отключить выделение? Спасибо ! –

+0

@ user1738342 Привет, я использую boxen/homebrew, поэтому для моего файла ruby.vim является '/ opt/boxen/homebrew/Cellar/vim/7.4.335/share/vim/vim74/syntax/ruby.vim' Если вы используя системный по умолчанию Vim, скорее всего он будет здесь '/ usr/share/vim/vim73/syntax'. Просто убедитесь, что номер версии правильный. –

9

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

17

С another stack overflow question, я получаю ВИМ быстро, добавив следующую строку в .vimrc файл:
set re=1
Это заставит Vim использовать старую версию регулярных выражений, и это на самом деле БЫСТРЕЕ рубина.

+0

Решила мою проблему +1 – xis

+0

Омигод, это было полностью. Ty Ty Ty !!!! –

+0

Бедро, бедро, ура! – mljrg

2

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

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

let ruby_no_expensive=1

0

Для меня это было set relativenumber особенность, которая была замедляя его. Попробуйте отключить его с помощью set norelativenumber и проверьте.

Смежные вопросы