Emacs-24自动完成跨目录头文件

时间:2014-06-18 18:39:50

标签: c++ emacs autocomplete cedet

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中定义{ {1}}。


我尝试了一些解决方案(与CEDET相关):

  • my_inc

    此解决方案在此处起作用。我不想申请这个,因为

    1. 因为我有很多项目,所以我的(ede-cpp-root-project)会很大。

    2. .emacs这里无法处理20多个子模块的复杂头部依赖性,这使得这个解决方案更像玩具。我更喜欢将配置与:include-path分开。

  • EDE项目

    我通过.emacs和c c创建项目和目标。 t,但这仅用于编译而不是名称,方法自动完成。

  • ede-new

    正如this questionmanual on ede-generic-project的解决方案中所述,但我收到此错误:

       eieio-oref:错误的类型参数:(或eieio-object-p class-p),nil

    执行后:

    ede-generic-project之后

    M-x ede-customize-project RET


环境:我使用Emacs 24.3并安装了(ede-enable-generic-projects)auto-complete

1 个答案:

答案 0 :(得分: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强制它。