当语法设置为Ruby时,(Mac)Vim运行非常缓慢

15

我使用命令行版本的Homebrew安装的MacVim 7.4。

在vim中为Ruby代码启用语法高亮显示时,vim运行缓慢。 htop 显示移动到 Ruby 文件内时,CPU 使用率达到了 80%-100%。

我在 Stack Overflow 上找到了以下内容:

并尝试了提出的解决方案。 我所做的:

  • set regexpengine=1: 没有变化。 CPU 使用率仍然非常高,性能很差。
  • set lazyredraw: 情况有所改善,但是牺牲非常明显(光标在移动时消失)
  • 我检查了我的 .vimrc 中的 autocmd 语句,没有发现特别缓慢的地方。 我尝试删除所有插件,但问题仍然存在。

我尝试关闭语法高亮,好了,它解决了问题。 同样,使用vim -u NONE启动vim,然后打开 syntax on 也解决了问题,所以我猜这一定是我的 .vimrc 中的某些设置引起的问题?

这里是我的vimrc的链接。

编辑

我可能已经找到了问题所在的设置。 似乎有两个设置明显地减慢了vim中的移动:

  • set relativenumber
  • set cursorline

请注意,这两个设置即使单独存在都会触发此行为。

这些设置会在使用 jk 滚动时强制 vim 在屏幕上重新绘制很多内容。 我怀疑这里没有解决方案,但我非常乐意尝试任何加速的方法。

编辑 #2

请注意,只有在 Ruby 文件中使用 relativenumbercursorline 时才会触发此行为。我尝试了其他所有文件类型(使用 relativenumbercursorline),无论长度如何都可以平滑滚动。

1
你是否有一些非常长的代码行或者一个非常长的文件?如果是这样,可能没有太多可以做的了... - maerics
@maerics 不,没有这样的事情。请看我的编辑以获取更多信息。 - whatyouhide
我可以在没有 .vimrc 和插件的情况下,只使用“:set relativenumber”和“:syntax on”,仅在 Ruby 文件中重现此问题。下面的答案没有帮助,因为 foldlevel=manual。 - Edward Anderson
FYI,我已经向vim项目提交了此问题:https://code.google.com/p/vim/issues/detail?id=282 - Edward Anderson
@nilbus: :help tex-slow 建议在“慢速机器”上使用两个 :syn sync 设置来减轻语法高亮的负担。也许对于 Ruby 的复杂高亮有所帮助? :syn sync maxlines=200 | syn sync minlines=50 还可以尝试在 syntax.txt 帮助文件中搜索“slow”以获取其他提示。 - idbrii
3个回答

2
正如avivr所说,由于foldmethod=syntax,Vim在处理大文件时(特别是对于插入完成)有时会变得很慢。
从:help todo中可以看到:
  • 折叠和PHP语法高亮的组合速度较慢。有脚本可复现。由“syntax sync fromstart”与补丁7.2.274结合使用引起。(Christian Brabandt,2010年5月27日)一般来说,“foldmethod”设置为“syntax”的折叠速度较慢。进行剖析以找出原因。
FastFold插件使得折叠只在保存时重新计算(因此您始终使用foldmethod=manual - 但折叠是使用foldmethod=syntax或您之前设置的任何内容计算的)。
这解决了我的问题。现在我可以在我的5000行C++文件中使用整行完成功能,它非常快而且反应迅速,而不是花费几分钟时间并且不响应。

这可能对你有影响,但与原帖问题无关,因为即使使用foldmethod=manual,问题仍然存在。 - Edward Anderson

0

众所周知,Ruby语法文件速度较慢,最好禁用'cursorline'和'cursorcolumn',因为它们会产生最大的影响。

但是,您还应该查看Vim slow with ruby syntax highlighting。这可能也有助于改善事情。


1
OP 发布了那个链接作为他查看的事情之一。 - FDinoff

0

我遇到了这个问题,也尝试了set regexpengine=1和其他各种方法。对我来说,似乎速度缓慢程度取决于正在编辑的文件的大小/复杂性,但花了一段时间才找到确切的原因。

在我的情况下,罪魁祸首是以下设置:

autocmd Filetype ruby setlocal foldmethod=syntax

这个设置告诉Vim根据语法元素(类、函数、条件语句)自动创建折叠。 我认为在这种情况下使用autocmd设置并不重要。 我认为问题在于对于相当复杂的文件,在编辑过程中更新折叠,导致复杂文件的速度显著降低。

希望这能帮助到某些人。


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