auto-complete
不适用于具有多个模块的Emacs C ++项目。每个子模块所依赖的头文件都存在于模块本身和其他模块中。换句话说,一个模块可以包括另一模块的头文件。
以下是我的示例源代码:
.
├── CMakeLists.txt
├── my_inc
│ ├── CMakeLists.txt
│ ├── myadd.cpp
│ └── myadd.h
├── README.md
└── src
├── CMakeLists.txt
├── Hello.java
├── helper.cpp
├── helper.h
└── main.cpp
main.cpp
:#include "myadd.h"
#include "helper.h"
int main() {
MyAdd add_obj;
Helper h;
h.toString(); // Auto-complete works since Helper is in the same directory.
add_obj. // Auto-complete for add_obj does not work
// because myadd.h is in another directory (my_inc).
}
当在
.
之后键入h
时,方法列表会弹出,但对于变量add_obj
却不会,该变量的类在其他模块myadd.h
的my_inc
中定义。我尝试了一些解决方案(与CEDET相关):
(ede-cpp-root-project)
此解决方案在这里有效。我不想应用这个,因为
因为我有很多项目,所以这会使我的
.emacs
变大。:include-path
此处无法处理20多个子模块的复杂标头依赖性,这使此解决方案更像是toy。我更喜欢将配置与.emacs
分开。EDE项目
我通过
ede-new
和c c创建项目和目标。 t,但这仅用于编译而不是名称,方法自动完成。ede-generic-project
如this question和manual on
ede-generic-project
的解决方案中所述,但出现此错误:eieio-oref:错误的类型参数:(或eieio-object-p class-p),nil
一旦执行:
ede-customize-project
之后的M-x (ede-enable-generic-projects)
RET。环境:我使用Emacs 24.3并安装了
auto-complete
和cedet2.0
。 最佳答案
解决涉及项目,头文件和完成的问题时,第1步是启用(global-semantic-decoration-mode 1)
,其中包括一种机制,该机制在找不到时以红色突出显示头文件。这有助于快速解决配置问题。
如果您想保持.emacs
文件的清洁并获得一些项目支持,那么最好使用通用项目类型,直到该错误开始出现为止。截至撰写本文时(2014年7月14日),该问题已在ede-ldf分支下的CEDET bzr存储库中修复,并将在不久的将来合并。
如果您有很多子模块,则还可以依赖GNU Global之类的工具。 cedet手册有一小段关于使用GNU Global的小节,其中包括帮助您查找文件的代码段。这样,Global将跟踪您的所有标头,然后可用于查找它们。如果所有标头都具有唯一的名称,则将一切就绪。如果文件“ myadd.h”存在于多个位置,并且您需要根据C文件的位置选择哪个“ myadd.h”,那么您将很不走运,并且需要自定义项目类型来执行此操作。
每次配置更改后,您都需要使用要查找的标头对缓冲区进行强制重新解析,以便刷新缓存。使用C-u M-x bovinate RET
强制执行。