我刚刚按照 Github 上的介绍编译安装了 Vim、Vundle 和YouCompleteMe插件。但是 YouCompleteMe 插件在我的 Vim 中不能很好地工作。它可以自动完成变量的名称,但它不会自动完成 STL 对象(向量、映射)的操作。它甚至不能自动完成课程中的“this->”。它总是告诉我“(^U^N^P)找不到模式。” 你们以前见过这个吗?我使用 Ubuntu 12.04。我应该怎么办?
2 回答
该插件的github repo上的自述文件现在解决了这个问题。
这是由 libclang 的问题引起的。从 clang 编译二进制文件使用正确的默认头文件搜索路径,但从 libclang.so 编译则没有。这个问题似乎对某些操作系统的影响比其他操作系统更大。似乎 OS X Mavericks 尤其在这方面存在问题。
当前的解决方法是调用 echo | clang -v -E -x c++ - 并查看 #include <...> 搜索从此处开始的路径:标题。您应该采用这些路径,将 -isystem 添加到每个单独的路径,并将它们全部附加到您从 .ycm_extra_conf.py 文件中的 FlagsForFile 函数返回的标志列表中。
您可能还想查看相应的问题
我也来这里寻找答案,我不知道 python 并且以前从未破解过其他东西。所以这就是我的做法。
查找错误消息。我去了 ~/.vim/bundle/YouCompleteMe 并寻找 "builtin includes" 。为什么?因为那是错误信息的一部分
- 一个。我没有在那里找到它,所以去了更高的级别(cd ..)并重复。
- 湾。发现它见下文./vundle/plugin/libclang.py:打印“警告:NxD libclang 找不到内置包含。”
修改错误消息以确保该文件正在运行(我的姓名缩写 NxD) - 有效。
- 该消息由 initClangComplete 打印
- 在此调用 builtinHeaderPath = getBuiltinHeaderPath(library_path) 之后打印消息,因此我们深入研究 builtinHeaderPath
getBuiltinHeaderPath 在已知目录上运行一个循环。我有 2 个 clang 安装
- 一个。~/Downloads 目录 - 世界上所有软件都被转储的地方
- 湾。/usr/local 因为我想要克隆、编译和构建的最新 clang
我将两个路径都添加到了这个数组:knownPaths
"/usr/local/include", "/usr/local/lib/clang/3.3", "/home/nxd/Downloads/clang+llvm-3.2-x86_64-linux-ubuntu-12.04/clang/3.2"
我注意到“,”是python中数组元素的分隔符。我之前还注意到 print -> 在 python 中输出一条消息,参数是 c 风格的 %s、%d 等工作 - (这就是“内置包含”消息首先出现在屏幕上的方式)
我还将一些打印语句转储到循环中,以便查看它看到了什么以及它在做什么。
部分代码修改函数“getBuiltinHeaderPath”
print "active path from knownPaths is |%s|" %path files = os.listdir(path) print " files in path is |%s|" % files print " len (files) is |%d|" % len(files) if len(files) >= 1: files = sorted(files) subDir = files[-1] else: subDir = '.' # nxd - subDir = '.' path = path + "/" + subDir + "/include/" print " len (files) is |%d|" % len(files) print " files[-1] is |%s|" % files[-1] print "searching in path : |%s| " % path
我意识到 files[-1] 的预期行为不是作者的意图,并在 if 条件之后对其进行了修改以保持不变。
使用新的 cpp 文件重新启动 vim 并查看 :messages - 它有效。
希望有帮助。