为特殊项目结构配置VIM YouCompleteMe

为特殊项目结构配置VIM YouCompleteMe,vim,autocomplete,vim-plugin,Vim,Autocomplete,Vim Plugin,我的C项目有以下结构。这是一个大项目的结构,我不能改变结构。我想使用YouCompleteMe来完成这个项目的语义代码 main/ // folder for C file to be compiled |- module1.c // module main C file. |- module2.c |- ..... module1/ |- mod1_func1.c // function file t

我的C项目有以下结构。这是一个大项目的结构,我不能改变结构。我想使用YouCompleteMe来完成这个项目的语义代码

main/                     // folder for C file to be compiled
  |- module1.c            // module main C file.
  |- module2.c
  |- .....
module1/
  |- mod1_func1.c         // function file to be included in main module C file.
  |- mod1_func2.c
  |- mod2_func3.c
module2/
  |- mod2_func1.c
  |- mod2_func2.c
  |- mod2_func3.c
对于
moduleX.c
,这将包括所有相关的头文件和模块相关的c文件

#include "header1.h"
#include "header2.h"
...
#include "modX_func1.c"
#include "modX_func2.c"
modX_funcX.c
的内容有一个或几个函数定义。没有包含标题

// no header file included here
int modX_funcX(void) {.....}
因为没有包含相关的头,
clang
必须解析
moduleX.c
才能在
modX_funcX.c
上完成代码,我已经尝试了从命令行执行
clang
代码完成。下面的命令有效

clang -x c -fsyntax-only -code-completion-at mod1_func1.c:4:11 module1.c 
所以我的问题是:当我编辑
modX\u funcX.c
文件时,如何配置YouCompleteMe来完成代码

我猜修改YouCompleteMe源代码可能需要做这项工作。我目前的想法是使用以下格式添加文件映射数据库:

path_of_file_to_complete:path_of_file_for_clang_to_parse
因此,在发送代码完成请求之前,根据当前缓冲区名称从数据库中获取要解析的文件的路径,并将该文件名传递给
libclang


我的想法可行吗?如果是,在何处添加此文件映射功能

我认为我的项目结构真的很蹩脚,正如
pepper_chico
所说,但别无选择,我无法改变它。在过去的几天里,我对
YouCompleteMe
libclang
进行了一些黑客攻击,除了
complte\u filename
之外,还将
libclang
的API调用更改为pass
input\u filename

这是一次卑鄙的黑客攻击,但现在对我有效。如果有人感兴趣,我会写一篇文章简要记录我的分析和黑客攻击过程

更新2015-02-03

一年后,当我回顾这个问题时,我终于想出了一个更好的方法来破解
YouCompleteMe
,满足我的需要。细节


我对GitHub的修改,请注意分支名称现在是
lamely

我不知道为什么是ctagged@Chinnac标签被移除。很抱歉。YCM是否尊重vim选项
“路径”
?尝试编辑mod1_func1.c和
:设置path+=/path/to/main/module1.c
。这有用吗?如果是这样,那么您可以使用自动命令或modeline自动执行此操作。我不确定YCM是否尊重vim
path
。即使是这样,项目也有15000多个源文件和头文件,这可能不是一种合适的方式。我为不同的产品线提供了一些类似的工作区。您看过CompliationDatabase支持吗?它可能对你有用,看看帮助。。。但在任何情况下,这种结构看起来都很蹩脚,就像试图嵌入Make-using-includes。。。