Vim因ruby语法突出显示而变慢

时间:2013-06-03 17:21:47

标签: ruby vim

我一直在使用vim over ssh工作一两个星期,一切都很顺利。今天我决定添加一些语法高亮,自动完成和其他一些通用插件。设置vundle并去上班。

我当前的.vimrc可以在https://github.com/scottopell/dotfiles/blob/master/.vimrc

找到

我已经将我的vimrc和vim文件克隆到我的本地ubuntu桌面上,vim运行完全符合预期,我找不到的任何文件都没有慢。相同的插件和相同的vimrc,并且在ruby文件上没有慢。

更新

我可以使用以下.vimrc

重现此问题
syntax on

和一个空的~/.vim文件夹。

然而,使用ruby / haml文件,这个vps上的vim非常慢。更多的红宝石文件。当我打开任何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路径,将foldlevel设置为手动,禁用我的colorscheme,没有任何帮助。 请参阅edit3

如果有帮助,我可以发布任何文件的完整startupttime日志。
我已经测试了一些其他语言(php,c,python,vimL),没有经历任何减速。


编辑:为了澄清,我正在运行ssh user @ server的ssh会话,然后在服务器内部运行vim file.rb。

EDIT2:我只是尝试直接访问服务器,并且在没有ssh的情况下仍然存在缓慢,我已经更新以反映这不是ssh的问题。

EDIT3:我可以使用.vimrc文件重现此问题,该文件包含带有空〜/ .vim文件夹的单行syntax on

EDIT4 我卸载了我编译的vim版本以及我可能通过apt安装的任何版本,手动删除了我系统中的所有vim内容,然后我可以使用vim -u NONE /path/to/file.rb运行vim do:syn on,问题就在那里。有问题的文件是一个rails控制器,但就像我说的那样,我可以在某种程度上用大多数文件重新创建它,但是rails控制器看起来是最差的。

7 个答案:

答案 0 :(得分:97)

这个问题的解决方案被证明是vim使用的正则表达式引擎。 关于freenode上#vim的推测是ruby语法文件在新的正则表达式引擎上使用的速度较慢。

任何早于Vim 7.3.969的版本都有旧的正则表达式引擎。 将set re=1添加到vimrc以强制旧版正则表达式引擎更新版本(并且不要忘记重新加载当前正在使用:e编辑的文件)。

感谢来自#vim的Houl,Dolio和dmedvinsky寻求帮助。

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

答案 1 :(得分:16)

您应该在vimrc中设置这两个选项:

set ttyfast
set lazyredraw

如果这不能解决您的问题,请尝试在没有vimrc的情况下启动vim,以确保没有任何当前设置将其搞砸。

vim -u NONE

答案 2 :(得分:12)

有助于加快Ruby语法突出显示的两件事是禁用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

答案 3 :(得分:6)

尝试在vimrc中明确设置ruby路径:

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

答案 4 :(得分:6)

我正在使用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

答案 5 :(得分: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语法文件不是我能看到的版本,但是它最后一次编辑' d 28 aug 13。

它不是一个ruby项目,但在编辑一个大的php类文件时(

    $ php -w test.inc | wc
    2    2410   19220

)我注意到课程顶部附近的重大延迟,但不高于或低于班级,并且值得注意的是,不是在班级的最低点。当我试图在类的底部附近插入新文本时,延迟是最小的,并且似乎与类内的行号成比例。 "最小"意味着几乎立即,"重要"表示每个字符1到1.5秒。

该文件大约1800行,约500行合法php和1300行评论和文档。该课程从约30行开始,到1700年左右结束。有人承认它有点大,但有充分记录: - \

如果我插入

    class dummy { }

在原版"类原始名称前面{", 文件中的任何地方都没有延迟。这个难看的kluge允许vim / gvim重新获得响应,可以被认为是一种解决方法。注意两者之间没有换行,只是

    class dummy { } class originalName {

它甚至可以评论出来:

    /*class dummy {}*/class originalName {

其他信息:

  1. 在此测试期间,插件目录已移动。

  2. 使用"设置syntax = off",问题完全消失。这不是解决办法。

  3. 使用

    设置正则表达式引擎
    set regexpengine=1   (or any other number)
    

    没有明显改变结果。

  4. 根据这些结果,我会怀疑正则表达式引擎。我的观点是,使用ruby文件中的语法进行一些处理可能会导致解决方法。

    更新: 我发现这个问题已经引发了#34;通过将php_folding设置为1(启用)。我正在使用的那个vimrc不是,但至少有一些神秘因为那个错误而被解决了。像这样的简单vimrc会导致问题(对我来说,至少):

        :syntax enable
        :let php_folding = 1
    

    这意味着我的问题与ruby问题完全无关,但ruby.vim文件可能会发生类似的事情。也许不是。

    为偏转道歉。

答案 6 :(得分:0)

我尝试了大部分这些解决方案,但最终为我工作的最好的方法是删除与航空公司相关的所有插件。

相关问题