Vim的自动完成速度极慢

70

大多数时候,Vim中的自动完成功能对我来说很好用,但有时它似乎会扫描当前文件引用的其他文件,然后变得非常缓慢,有时需要几秒钟才能将焦点释放回给我。

有时Vim只告诉我它正在“扫描”,有时它在说“扫描标签”

我只在Ruby文件中遇到过这种情况,并且它通常发生在文件中有一个require语句的时候。

我猜这是一种检查自动完成选项相关文件的功能,但我并不真正需要它,并且更希望更快速的自动完成。


1
你使用的 completefunc 是什么? - Randy Morris
1
我有同样的问题,但是在C++中。你解决了吗?我尝试过使用和不使用标签文件进行调整,但它仍然会递归扫描当前目录(我使用strace查看了它的操作,并且它会对所有可以找到的文件调用stat)。这是一个clearcase环境==非常慢。 - falstro
3个回答

122

正如我在评论中提到的,我也遇到了同样的问题。这是我发现的解决方法;

VIM有一个设置选项告诉它在哪里寻找自动补全,称为complete

:set complete
complete=.,w,b,u,t,i

这是默认值。我的问题是(实际上是曾经的问题),'i'扫描所有包含的文件。这里有两个问题,第一个问题是找到所有这些文件可能需要相当长的时间,特别是如果你像我一样拥有很多文件。

:set path=**

第二个问题是,一旦找到这些文件,就需要阅读它们。如果你使用网络文件系统(我使用的是clearcase),那么查找和阅读所有这些文件可能会触发缓存未命中,导致速度非常慢。

我现在已经删除了“i”,因为我有一个tags文件,而且往往也有相关的文件在我的缓冲区中(已加载或未加载),这些文件将作为“b”和“u”的结果进行搜索。

使用:

set complete-=i

要从列表中删除 i,请注意这仅在该缓冲区内有效。


非常感谢。这是其中一个未被充分关注但非常相关的配置选项,在“insert.txt”帮助文件中没有提到。 - sehe

47

自从升级到Vim 7.3(从7.2)后,我遇到了一个非常类似的问题:我正在使用(优秀的)ACP插件在较长的源文件(C文件,1700行代码)中,在我编辑文件底部附近时,弹出窗口需要很长时间才能跳转到建议列表上。

使用PerformanceValidator(来自Softwareverify),我发现有些折叠方法一遍又一遍地被调用,导致处理器负载非常高,进而导致自动完成缓慢。

我的解决方法是将foldmethod (fdm)设置为manual。这解决了问题...


1
你真棒。对我来说,在相当小的文件(~100行代码)中,Ruby文件的完成速度非常慢。我无法解决这个问题。然后我读到了这篇文章。我将Ruby缓冲区中的foldmethod更改为除“syntax”之外的任何内容,自动完成就会立即发生。现在,为什么Vim在执行自动完成时会不断调用foldmethod呢? - Legion
1
这对我也起作用了。再说一遍,“为什么当Vim在做自动完成时,foldmethod会被疯狂调用?”!! - Jason
2
如果可以的话,我会给予+5分。向这篇博客致敬,因为它让我找到了这里。 - Kelvin
这真是太好了,解决了我的问题...我难道真的要在一个400行的文本文件中选择折叠和单词补全之间吗? - Hubro
@Hubro:是的,看起来是这样。但说实话,我从来没有真正使用过折叠...也许其他自动完成工具(例如YCM,即YouCompleteMe)的行为与ACP不同? - eckes
显示剩余3条评论

6

您正在进行的项目是否有一个标签文件?如果没有,请尝试使用exuberant-ctags生成一个文件,Vim应该可以通过taglist插件检索到它。


1
ctags -R是在Linux上项目根目录中的命令。 - gustavgans
ctags -R -n --fields=+i+K+S+l+m+a --exclude=src/react/conf-srch/node_modules . 更具体地说: - Yordan Georgiev

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