为Vim自动补全递归包含一个目录

4

我在源代码的基本目录中使用vim。当编辑单个文件时,我希望自动完成考虑此目录(以及子目录)中每个文件的每个单词。


谢谢大家,set complete= 和 argadd 都起作用了。由于不支持 Scala,没有尝试 Exuberant Ctags。 - Dan Billings
3个回答

8

完成由'complete'选项控制。使用k标志,您可以让Vim扫描文件。通配符**代表递归进入子目录。大功告成:

:set complete=k**/*

如果您想保留其他默认位置(例如其他缓冲区、包含的文件等),请使用:set complete+=添加到其中。


或者,由于这可能对默认设置来说太慢了,您可以使用“字典”选项并使用Ctrl-X Ctrl-K完成:

:set dictionary=**/*

5
:argadd **/*

这将递归地将所有文件加载到缓冲区中,自动补全将考虑它们。请注意,这将加载所有文件,包括您可能不想添加的文件,例如二进制文件或CVS目录中的文件。一个更细粒度的glob(如下面的示例)可能是个好主意。

:argadd **/*.cpp

1

我认为更好的方法是使用Exuberant CTags在您的目录系统中生成一个标签文件。

首先,在源代码的根目录中构建您的tags文件:

ctags -R .

这可能会找到比您想要的更多的内容,但您可以使用进一步的命令行选项进行调整。

将您的tags选项设置为引用此文件("tags"是默认名称),或使用set tags=./tags;/搜索您的目录树以查找第一个标签文件。请参阅:help file-searching了解向上搜索的;/语法。

最后,请确保't'在您的完整选项中。它默认已经存在,但是可以通过set complete?检查。如果不存在,则set complete+=t将其添加到其中。

我个人会从我的'complete'选项中移除'i'和'd',因为磁盘访问很烦人,即使键入CTRL_Y(是,接受完成)或CTRL_N(否,拒绝完成)或继续正常输入也会停止搜索。如果所有包含的文件都在您的标签文件中,您将立即找到完成。


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