语法高亮会导致Vim出现可怕的延迟

时间:2013-09-26 13:56:07

标签: 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

那不是问题。

所以似乎问题是Syntax Highlighting与我的一个或多个插件结合使用。我试过禁用一堆,没有运气。

有什么方法可以进行分析吗?我手动测试时已经筋疲力尽了。

有没有人有类似的经历?也许快速浏览我的.vimrc,看看是否有什么响铃。 https://bitbucket.org/furion/dotfiles

解: 导致混乱的插件是:

Bundle "gorodinskiy/vim-coloresque.git"

我建议您阅读答案,好的见解。

编辑(1个月后): coloresque插件已经有了一些改进。

11 个答案:

答案 0 :(得分:85)

:syntime on

在你的ruby文件中移动然后

:syntime report

它为我报告了以下最慢的匹配,你可以看到甚至没有一个匹配。

我在ruby.vim文件中禁用了rubyPredefinedConstant并解决了问题。 Vim正则表达式引擎不喜欢ruby语法高亮正则表达式中的东西。您必须在足够的语法高位和良好的性能之间找到平衡。

希望有所帮助,这是我的Mac OS 10.8.5,自制软件Vim 7.4(控制台vim)上报告的ruby的前3个最慢语法高亮正则表达式

    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*(\)\@!

或者您可以按照Dojosto

的指示尝试vim-ruby

答案 1 :(得分:28)

another stack overflow question,我通过在.vimrc文件中添加以下行来快速获得vim:
set re=1
这将迫使vim使用旧版本的正则表达式引擎,它实际上更快的红宝石。

答案 2 :(得分:23)

您有autocmd个垃圾邮件。在重新添加autocmds之前,应将所有autocmd语句包装在清除组的组中。看起来你的.vimrc已经将大多数autocmds注释掉了,所以可能有一个插件导致了这个问题。检查此命令的输出:

:au CursorMoved

如果那里有一堆重复的处理程序,那就是你的问题。

以下是来自my .vimrc的autocmd纪律示例:

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会在重新添加autocmds之前清除当前组(在这种情况下为vimrc_autocmd)。

答案 3 :(得分:13)

我注意到如果你使用任何动态改变背景颜色的东西,vim可以减速停止。尝试关闭:set cursorline:set cursorcolumn(如果已设置)。

答案 4 :(得分:11)

我发现“set foldmethod = syntax”使7.4几乎无法使用,例如对于js&amp; ruby​​文件(ubuntu 13.10),而“set foldmethod = indent”工作正常。

答案 5 :(得分:8)

我要感谢大家帮助我解决这个问题。好消息是,我的Vim再次活泼。

我开始重新安装新的Vim。我不是通过插件添加插件,直到找到了所有邪恶的根源。

Bundle "gorodinskiy/vim-coloresque.git"

它的插件让我感到很痛苦。由于我有一段时间,它不是一个嫌疑人,这就是为什么我这么晚发现它。 这个插件的作用是,无论何时找到颜色的单词(例如红色,绿色)或十六进制值(例如#FFFFFF),它都会设置文本的背景颜色以匹配其描述的颜色。很棒的想法,但似乎执行不力。

删除此插件可以消除滞后。

但我并没有就此止步。我也完成了对.vimrc的重大清理工作。删除了一些我没用过的插件。分组我的autocmd并删除不必要的内容。

我的Vim现在非常活泼。我很高兴。

答案 6 :(得分:4)

我很确定

set t_Co=256
set background=dark
colorscheme candyman

与这种滞后无关。两个第一行是无用的(可用颜色的数量是根据您的$TERM定义的,而您的colorscheme已经确定set background=dark)但不是真的有害。

常见的“Vim正在慢慢爬行”的原因包括写得不好autocmd,太多autocmd s,经常重新加载一个~/.vimrc,写得不好的插件......

请发布您的设置,以便我们帮助您找出遇到这种延迟的原因。

答案 7 :(得分:4)

语法突出显示可能很慢,但应限于某些(有些病态)文件和特定语法。最新的Vim 7.4有一个新命令:syntime来解决语法突出显示缓慢问题。

除此之外,通常还有一个二进制搜索,你可以在其中禁用一半的插件,然后只有一半(当问题仍然存在时)或另一半(当问题出现时)消失了,让你快速找到有问题的脚本。

答案 8 :(得分:3)

我已经有这个问题很长一段时间了,这让我发疯了。我尝试安装vim-ruby。不确定这是否有所帮助,但至少现在我拥有最新版本的ruby语法高亮显示(自上一版Vim发布以来,性能有所提高)。

然后我进一步观察,发现vim-ruby有一种模式可以跳过所有昂贵的突出显示。尝试将此行添加到您的vimrc并查看它是否有帮助(最终为我做了!):

$a = 0; // $thisSub = []; put this before you first while loop while ($row = mysql_fetch_array($query)) { $sub1 = $row['TopicName']; ?> <div class="col-sm-6"> <input type="checkbox" class="sub" name="checklist1[]" value="<?php echo $sub1;?>" disabled <?php echo (in_array($sub1, $thisSub)) ? 'checked="checked"' : ''; ?> > <?php $a++; ?> <label><?php echo $sub1;?></label> </div> <?php }

答案 9 :(得分:2)

对我而言set relativenumber功能正在放慢速度。尝试使用set norelativenumber禁用它并进行测试。

答案 10 :(得分:1)

以防万一它可以帮助任何人:

我不小心为我的项目创建了一个非常大的标签文件;所以我的语法荧光笔正在搜索大文件以突出显示函数名称。

所以检查你的标签文件! (在我的设置中,我使用的是easy-tags,所以我的被放置在~/.vimtags