Syntax highlighting causes terrible lag in Vim

vim

I love Vim. But its giving me hard times right now.

I use a lot of plugins and during the last 6 months, I've found a lot of awesome ones. But my Vim got really sluggish too. I do constant cleanups, but it doesn't help much.

I'm at the point, where Vim is completely unusable. It feels like it renders at 2-5 frames per second, switching tabs/buffers takes about a second, scrolling with hjkl is awfully terrible, the lag is so bad, even typing a sentence in insert mode is confusing (due to lag).

Edit: Actually, when I open fresh instance of Vim its OK-ish, but than within 15 minutes it becomes unusable.

I've just spent 4 hours trying to figure out which plugin or config is causing the pain. I was unsuccessful.

However, I did find out, that removal of this setting causes all the lag to go away:
syntax on

These 3 lines in conjunction with syntax make everything even worse.

set t_Co=256
set background=dark
colorscheme candyman

Interesting. So, syntax highlighting is turning Vim from super snappy to incredibly sluggish?

I tried enabling syntax in "clean" mode:
vim -u NONE

And its not an issue there.

So what seems to be the issue is Syntax Highlighting in combination with one or more of my plugins. I tried disabling bunch, no luck.

Is there any way to do profiling? I'm fairly exhausted from manual testing.

Has anyone had similar experience? Maybe take a quick peek into my .vimrc, see if anything rings a bell.
https://bitbucket.org/furion/dotfiles

SOLUTION:
The plugin causing the mess was:

Bundle "gorodinskiy/vim-coloresque.git"

I recommend reading the answers tho, good insights.

Edit (1 month later): The coloresque plugin has seen some improvements.

Best Answer

EDIT: Blogged about how this all works, with screenshots and awesome-sauce.

https://eduncan911.com/software/fix-slow-scrolling-in-vim-and-neovim.html

Original answer below...


:syntime on

move around in your ruby file and then

:syntime report

It reported the following slowest matching for me, and you can see that there are not even 1 match.

I disabled rubyPredefinedConstant in ruby.vim file and problem solved. Vim regex engine does not like something in ruby syntax highlight regex. You will have to find the balance between enough syntax highligting and a good performance.

hope that helps, here is the top 3 slowest syntax highlighting regex for ruby reported on my Mac OS 10.8.5, homebrew Vim 7.4 (console 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*(\)\@!

Or you can try vim-ruby as pointed out by Dojosto