为特殊项目结构配置VIM YouCompleteMe

时间:2014-02-13 06:19:00

标签: 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 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_funcX.c文件时配置YouCompleteMe来完成代码?

我想对YouCompleteMe源进行修改可能需要完成这项工作。我目前的想法是添加格式为:

的文件映射数据库
path_of_file_to_complete:path_of_file_for_clang_to_parse

因此,在发送代码完成请求之前,根据当前缓冲区名称从数据库中获取path_of_file_for_clang_to_parse,将此文件名传递给libclang

我的想法可行吗?如果是,那么添加此文件映射功能的确切位置在哪里?

1 个答案:

答案 0 :(得分:1)

我认为我的项目结构非常蹩脚,正如pepper_chico所说,但没有选择,我无法改变它。在过去的几天里,我对YouCompleteMelibclang进行了一些黑客攻击,将libclang的API调用更改为input_filename以及complte_filename

这是一个肮脏的黑客,但它现在对我有用。如果有人感兴趣,我会写一篇帖子来简要记录我的分析和黑客程序。

更新2015-02-03

1年后,当我回顾这个问题时,我终于想出了一个更好的方法来解决YouCompleteMe我的需要。详情look here

我对GitHub here进行了修改,请注意分支名称目前为lamely