【问题标题】:Vim slow with ruby syntax highlightingVim 用 ruby​​ 语法高亮显示很慢
【发布时间】:2013-05-29 22:23:45
【问题描述】:

我已经使用 vim 而不是 ssh 工作了一两个星期了,一切都很顺利。今天我决定添加一些语法高亮、自动完成和其他一些通用插件。设置vundle并开始工作。

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

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

更新

我可以用下面的 .vimrc 重现这个问题

syntax on

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

然而,这个 vps 上的 vim 对于 ruby​​/haml 文件来说非常慢。更多的红宝石文件。当我打开任何 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 设置为手动,禁用我的颜色方案,没有任何帮助。 见编辑3

如果有帮助,我可以发布任何文件的完整启动时间日志。
我测试了其他几种语言(php、c、python、vimL),没有一个遇到任何减速。


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

EDIT2:我刚刚尝试直接访问服务器,但没有 ssh 仍然缓慢,我已更新以反映这不是 ssh 的问题。

EDIT3:我可以使用包含单行 syntax on 和空 ~/.vim 文件夹的 .vimrc 文件重现该问题

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

【问题讨论】:

  • 你是如何通过 SSH 运行 Vim 的?在本地或远程编辑文件?
  • 您可以使用:set ttyfast,我相信还有一些其他设置可以控制意图 UI 延迟
  • 如果你在真机呢? vim 的加载时间应该不受 ssh 的影响,因为它在机器上计算所有信息,并且只通过网络发送所有信息。
  • @timss 我已经在帖子中澄清了,我正在远程编辑。
  • @demure 我刚刚尝试了 ttyfast,没有任何变化。

标签: ruby vim


【解决方案1】:

我使用的是 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​​ 文件时遇到的极其缓慢的问题,而其他任何方法都没有。瞬间解脱。非常感谢!
  • foldmethod=manual(或缩进)对我来说是正确的答案。
【解决方案2】:

这个问题的解决方案原来是 vim 使用的正则表达式引擎。 关于 freenode 上#vim 的猜测是 ruby​​ 语法文件在新的正则表达式引擎上使用了更慢的东西。

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

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

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

【讨论】:

  • 所以这毕竟是一个错误。感谢您对您的帖子、cmets 和回答如此耐心和自始至终!
  • 使用 set re=1 让 Vim 对我来说更慢。对此有何其他建议?
  • 不幸的是,所有答案都不适合我。我已经用vim -u NONE 对其进行了测试,而不是手动启用语法。问题出现了,所以我的设置或捆绑都没有导致问题。我正在使用 Vim 7.4,包括补丁 1-273。
  • 重要提示:您必须重新加载当前正在编辑的文件 (:e)!
  • @BrianZitzow set regexpengine=1 呢?
【解决方案3】:

请参阅底部的更新。

这可能是一种有用的解决方法 -

我用的是vim版本

VIM - Vi IMproved 7.4(2013 年 8 月 10 日,2014 年 1 月 2 日 19:40:46 编译)

包含的补丁:1-52

它是来自的库存版本 Linux Mint 17.1 丽贝卡。

php.vim 语法文件不是我可以看到的版本,但它的最后编辑日期是 13 年 8 月 28 日。

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

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

) 我注意到在班级顶部附近有明显的延迟,但没有高于或低于班级,尤其是没有接近班级底部。当我尝试在班级底部附近插入新文本时,延迟很小,并且似乎与班级内的行号成正比。 “最小”意味着几乎立即,“重要”意味着每个字符 1 到 1.5 秒。

该文件大约有 1800 行,其中大约 500 行合法 php 和 1300 行 cmets 和 doc。该课程从大约第 30 行开始,到大约第 1700 行结束。承认它有点大,但有据可查:-\

如果我插入

    class dummy { }

在原来的“class originalName{”前面, 文件中的任何地方都没有延迟。这种难看的 kluge 允许 vim/gvim 恢复其响应能力,并且可以被认为是一种解决方法。注意两者之间没有换行,只是

    class dummy { } class originalName {

它甚至可以被注释掉:

    /*class dummy {}*/class originalName {

附加信息:

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

  2. 使用“set syntax=off”,问题完全消失。这不是解决办法。

  3. 设置正则表达式引擎

    set regexpengine=1   (or any other number)
    

    不会明显改变结果。

基于这些结果,我也会怀疑正则表达式引擎。我的观点是,在 ruby​​ 文件中使用一些语法可能会导致解决方法。

更新: 我发现问题是通过将 php_folding 设置为 1(启用)“引起的”。我认为我使用的 vimrc 不是,但由于那个错误,至少一些谜团得到了解决。像这样的简单 vimrc 会引发问题(至少对我而言):

    :syntax enable
    :let php_folding = 1

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

为偏斜道歉。

【讨论】:

    【解决方案4】:

    我尝试了大多数这些解决方案,但最终对我最有效的是删除与航空公司相关的所有插件。

    【讨论】:

    • 如果禁用语法高亮可以解决问题,请先尝试。
    • 禁用语法使其更快,但我对不启用语法不感兴趣。
    • 我相信,那么它实际上是一个语法问题。航空公司问题中已提供问题编号。
    【解决方案5】:

    将极大地帮助加快 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
    

    【讨论】:

    • 是的!谢谢,在我的情况下,是 relativenumber 导致 vim 如此缓慢。
    • relativenumbercursorline 都为我减慢了速度。我可能离不开cursorline 但不是relativenumber
    • 如果您想保留relativenumbercursorline,则可以使用set lazyredraw 改善这种情况。这并不能解决问题,但可以减轻光标线突出显示的缓慢a
    【解决方案6】:

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

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

    【讨论】:

    • 我将 RVM 用于 ruby​​,所以这会是 let g:ruby_path="~/.rvm/bin/ruby" 吗?
    • 我刚试过你的建议和我的变体,都没有任何效果。
    • 这真的很有帮助。还因为我发现从配置文件中搜索 Ruby 路径需要 2.4 秒:1 2.426607 0.000126 let g:ruby_default_path = s:query_path($HOME)
    • 我现在有let g:ruby_path = ''。只要你定义了这个变量,你就会得到速度上的好处。
    • 这是为我解决的问题。其他事情没有任何明显的影响。
    【解决方案7】:

    你应该在你的 vimrc 中设置这个 tw 选项:

    set ttyfast
    set lazyredraw
    

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

    vim -u NONE
    

    【讨论】:

    • 我已将这两个添加到我的 vimrc 中,但它没有任何帮助。在没有我的 vimrc 的情况下运行确实可以解决问题,但只要我打开它的语法。不像以前那么糟糕,但肯定有明显的问题。
    • 好吧,在这种情况下...调试愉快。逐步禁用每个插件和选项以找出导致问题的原因。
    • 我已尝试使用 --noplugin 开关禁用我的所有插件,但仍然出现这种情况。我也试过清空我的插件目录,问题仍然存在。这就是我正在努力解决的问题。
    • 您是否一一禁用了每个设置选项?我认为第 25 行可能是您的问题
    • 太棒了!现在我可以从 Sublime 回到 VIM,因为 VIM 开始工作得更快了。
    猜你喜欢
    • 2016-08-16
    • 2015-04-24
    • 2016-05-07
    • 2010-09-08
    • 2010-11-26
    • 1970-01-01
    • 2012-08-16
    • 2014-05-15
    • 2012-12-04
    相关资源
    最近更新 更多