Vim在使用Ruby语法高亮时速度变慢

44
我已经使用vim通过ssh工作了一两个星期,一切都很顺利。今天我决定加入一些语法高亮、自动完成和其他常用插件。安装了vundle并开始工作。
我的当前.vimrc文件可以在https://github.com/scottopell/dotfiles/blob/master/.vimrc找到。
我已经将我的vimrc和vim文件克隆到本地的ubuntu桌面上,vim运行得非常好,没有发现任何文件变慢。相同的插件和vimrc,ruby文件也没有变慢。
更新:
我可以使用以下.vimrc文件重现此问题。
syntax on

还需要一个空的~/.vim文件夹。

然而,在这台VPS上,使用ruby/haml文件时vim非常缓慢。特别是ruby文件。当我打开任何ruby文件时,启动大约需要2秒钟(用--startuptime计时)。对于长度相当的haml文件,大约为0.5秒钟。这种缓慢不仅仅出现在启动时,移动和编辑文件也都非常缓慢。

Haml/erb(它们基本上是相同的)

268.818  000.005: before starting main loop
848.871  580.053: first screen update

红宝石

199.613  000.004: before starting main loop
2937.859  2738.246: first screen update

在与上述相同的Ruby文件中没有语法突出显示

149.047  000.004: before starting main loop
152.912  003.865: first screen update 

我已经尝试使用mosh(http://mosh.mit.edu),但没有帮助。现在不再相关

从我的.vimrc文件中可以看到,我已经尝试了几种不同的解决方案来解决这个问题。我尝试禁用所有插件(我将它们全部从~/vim/bundle/PLUGINNAME移动到~/vim/bundle/disabled/PLUGINNAME,这样做是否正确?),设置Ruby路径,将折叠级别设置为手动,禁用我的配色方案,但都没有帮助。请参见edit3

如果需要,我可以发布任何文件的完整启动时间日志。 我已经测试了一些其他语言(PHP、C、Python、VimL),没有一个遇到任何减速问题。


编辑:为了澄清,我正在运行一个ssh会话,使用ssh user@server然后进入服务器后我正在使用vim file.rb。

编辑2:我刚试图直接访问服务器,慢速仍然存在,我已经更新以反映这不是ssh的问题。

编辑3:我可以通过包含单行syntax on的.vimrc文件和空的~/.vim文件夹来重现该问题。

编辑4:我卸载了编译版本的vim和我可能通过apt安装的任何版本,手动从系统中删除了所有vim内容,然后我可以使用vim -u NONE /path/to/file.rb运行vim,然后进行:syn on,问题将出现。所涉及的文件是rails控制器,但正如我所说,我可以在大多数文件中以某种程度上重新创建它,但rails控制器似乎是最糟糕的。


你可以尝试使用 :set ttyfast 命令,我相信还有其他一些设置可以控制界面延迟。 - demure
@timss 我在帖子中已经澄清了,我是远程编辑。 - ScottO
@demure 我刚试了一下ttyfast,但没有任何改变。 - ScottO
@timss 刚刚尝试了一下,删除 viminfo 没有帮助,所以我把旧的 viminfo 放回去并删除了生成的文件。 - ScottO
@JimStewart 我搞错了,那个文件是507c,可能有些是空格,因为它看起来不是很长。我已经尝试设置synmaxcol,但没有任何帮助。 - ScottO
显示剩余14条评论
7个回答

102

解决这个问题的方法是使用vim所使用的正则表达式引擎。 在freenode上的#vim上猜测,ruby语法文件使用了新的正则表达式引擎的某些功能使速度变慢。

Vim 7.3.969及其以下版本使用旧的正则表达式引擎。 在vimrc中添加set re=1以强制任何更新的版本使用旧的正则表达式引擎(别忘了使用:e重新加载你当前正在编辑的文件)。

感谢#vim的Houl、Dolio和dmedvinsky提供的帮助来解决这个问题。

我还没有机会尝试最新的版本,昨晚有一次提交可能有助于解决这个问题。如果我有机会再次尝试最新的版本,我会更新这个问题。


1
所以这真的是一个错误。感谢您在帖子、评论和答案中的耐心和全面性! - timss
8
使用set re=1会让我的Vim变得更慢。还有其他的建议吗? - Simon Ernst
1
不幸的是,所有答案都对我无效。我已经使用 vim -u NONE 进行了测试,然后手动启用语法。问题出现了,所以我的任何设置或捆绑都不会引起问题。我正在使用 Vim 7.4,包括补丁1-273。 - OrangeTux
8
重要提示:为使此功能生效,您必须重新加载当前编辑的文件(:e)! - tckmn
1
@BrianZitzow set regexpengine=1 是怎么样的? - mb21
显示剩余8条评论

17

你应该在vimrc文件中设置以下两个选项:

set ttyfast
set lazyredraw

如果这不能解决你的问题,尝试在不使用你的 vimrc 的情况下启动 vim ,以确保没有当前设置影响了它。

vim -u NONE

1
我已将它们添加到我的vimrc中,但没有任何帮助。在没有vimrc的情况下运行可以解决问题,但是一旦打开语法检查,问题就会出现。虽然不像以前那么糟糕,但明显有些不对劲。 - ScottO
在这种情况下,快乐调试。禁用每个插件和选项以逐步找出引起问题的原因。 - Denny Crane
我已经尝试使用 --noplugin 开关禁用所有插件,但问题仍然存在。我还尝试清空我的插件目录,但问题仍然存在。这就是我正在努力解决的问题。 - ScottO
你一个一个地禁用了每个设置选项吗?我认为第25行可能是你的问题所在。 - Denny Crane
我已经尝试禁用我认为可能会影响它的所有内容。第25行没有帮助。我刚刚尝试使用一个全新的.vimrc文件,我所做的只是syntax on,我可以重现这个问题。 - ScottO
1
太棒了!现在我可以从Sublime回到VIM,因为VIM开始运行得更快了。 - Artem Pianykh

14

两件事情可以极大地帮助加速 Ruby 语法高亮,那就是禁用光标行和相对行号(如果你使用它们的话)。

我在我的 .vimrc 文件中添加了以下内容:

" Ruby is an oddball in the family, use special spacing/rules
if v:version >= 703
  " Note: Relative number is quite slow with Ruby, so is cursorline
  autocmd FileType ruby setlocal ts=2 sts=2 sw=2 norelativenumber nocursorline
else
  autocmd FileType ruby setlocal ts=2 sts=2 sw=2
endif

是的!谢谢,是相对行号导致我的vim运行缓慢。 - bemug
relativenumbercursorline 都会减慢我的速度。我可能无法没有 cursorline,但可以没有 relativenumber - Kris
1
如果您想保留relativenumbercursorline,则可以通过set lazyredraw来改善情况。这并不能解决问题,但可以减轻光标行高亮的缓慢性能。 - Punkman

8
我正在使用vim 7.4.52,但这些解决方案都对我无效。
根据此github问题的评论(https://github.com/vim/vim/issues/282#issuecomment-169837021),foldmethod=syntax是导致速度慢的原因。
将其添加到我的.vimrc中,最终解决了问题!
augroup ft_rb
    au!
    " fix the SLOOOW syntax highlighting
    au FileType ruby setlocal re=1 foldmethod=manual
augroup END

这解决了我一直遇到的极慢的 Ruby 文件编辑问题,其他方法都没用。瞬间感觉轻松了许多。非常感谢! - omnikron
foldmethod=manual(或indent)对我来说是正确的答案。 - s00pcan

7

尝试在您的vimrc中明确设置您的Ruby路径:

let g:ruby_path="/usr/bin/ruby"

我使用 RVM 来管理 Ruby,那么这应该是let g:ruby_path="~/.rvm/bin/ruby"吗? - ScottO
我刚刚尝试了你的建议和我的变化,但都没有任何效果。 - ScottO
2
这非常有帮助。也因为我发现从档案中搜索Ruby路径需要2.4秒:1 2.426607 0.000126 let g:ruby_default_path = s:query_path($HOME) - Cam Song
我目前有 let g:ruby_path = ''。只要您定义了这个变量,就可以获得速度上的优势。 - Jerome Dalbert
1
这是解决我的问题的方法。其他的尝试都没有明显的效果。 - Arpit Chauhan
这是我在大量搜索后解决问题的方法。我使用了“which ruby”来确定要放在路径中的内容。谢谢! - Udi

1
请看底部更新。
这可能有助于解决问题 -
我正在使用vim版本
VIM - Vi IMproved 7.4(2013年8月10日,编译于2014年1月2日19:40:46) 包括补丁:1-52
这是来自Linux Mint 17.1 Rebecca的原始版本。 php.vim语法文件没有版本号,但它说最后编辑于2013年8月28日。
虽然这不是一个Ruby项目,但当编辑大型PHP类文件时(
    $ php -w test.inc | wc
    2    2410   19220

我注意到在类的顶部附近有显著的延迟,但不是在类的上面或下面,特别是不是在类的底部。当我尝试在类的底部插入新文本时,延迟很小,并且似乎与类内行号成比例。 "很小"表示几乎瞬间完成,"显著"表示每个字符需要1到1.5秒。

该文件大约有1800行,其中大约有500行合法的PHP代码和1300行注释和文档。该类从大约第30行开始,到大约第1700行结束。虽然它有点大,但文档做得很好 :-\

如果我插入

    class dummy { }

在原始代码中的"class originalName {"之前,文件中没有任何延迟。这种不美观的修补程序使得vim/gvim能够恢复其响应性,并且可以被视为一种解决方法。请注意两者之间没有换行符。
    class dummy { } class originalName {

it can even be comment'd out:

    /*class dummy {}*/class originalName {

附加信息:
  1. during this test, the plugins directory was moved.

  2. with "set syntax=off", the problem completely disappears. this is NOT a fix.

  3. setting the regular expression engine with

    set regexpengine=1   (or any other number)
    

    does not appreciably change the results.

基于这些结果,我也怀疑正则表达式引擎。我的意思是,在Ruby文件中略微调整语法可能会导致解决方法。
更新: 我发现问题是由将php_folding设置为1(启用)所“引起”的。我原以为我使用的vimrc没有问题,但至少由于那个错误,部分神秘之处得到了解决。像这样简单的vimrc对我来说会引发问题。
    :syntax enable
    :let php_folding = 1

这意味着我的问题与Ruby问题完全无关,但是可能存在与ruby.vim文件类似的情况。也可能不是。
抱歉转移话题。

0

我尝试了大多数的解决方案,但最终对我最有效的方法是删除与airline相关的任何插件。


首先尝试禁用语法高亮看能否解决问题。 - Christian Brabandt
禁用语法可以提高速度,但我不想在没有启用语法的情况下工作。 - Uri
我相信,那实际上是一个语法问题。航空公司已经提供了问题编号。 - Christian Brabandt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接