我认为CEDET是为MinGW gcc自动完成的,它运行得很好,但是我无法获得完成STL库成员的g ++工作。例如,我无法自动完成std :: string变量来获取c_str()或其他函数:
#include <string>
#include <iostream>
using namespace std;
int main(int argc, char *argv[])
{
string s;
s. // no pop up member functions here
return 0;
}
这是我的.emacs的配置部分:
;; setting up for semantic-mode
(semantic-mode 1)
(require 'semantic/bovine/c)
(setq MinGW-64-base-dir
"D:/MinGW/x86_64-w64-mingw32/include")
(add-to-list 'semantic-lex-c-preprocessor-symbol-file
(concat MinGW-64-base-dir "/crtdefs.h"))
(add-to-list 'semantic-lex-c-preprocessor-symbol-file
(concat MinGW-64-base-dir "/yvals.h"))
(add-to-list 'semantic-lex-c-preprocessor-symbol-file
(concat MinGW-64-base-dir "/vadefs.h"))
(add-to-list 'semantic-lex-c-preprocessor-symbol-file
(concat MinGW-64-base-dir "/comdefsp.h"))
(semantic-c-reset-preprocessor-symbol-map)
(defconst user-include-dirs
(list ".." "../include" "../inc" "../common" "../public"
"../.." "../../include" "../../inc" "../../common" "../../public"))
(defconst win32-include-dirs
(list "D:/MinGW/include"
"D:/MinGW/x86_64-w64-mingw32/include"
"D:/MinGW/lib/gcc/x86_64-w64-mingw32/4.7.2/include"
"D:/MinGW/lib/gcc/x86_64-w64-mingw32/4.7.2/include/c++"
"D:/MinGW/lib/gcc/x86_64-w64-mingw32/4.7.2/include-fixed"
))
(let ((include-dirs user-include-dirs))
(when (eq system-type 'windows-nt)
(setq include-dirs (append include-dirs win32-include-dirs)))
(mapc (lambda (dir)
(semantic-add-system-include dir 'c++-mode)
(semantic-add-system-include dir 'c-mode))
include-dirs))
我的配置有问题吗?需要MinGW g ++的正确配置。
答案 0 :(得分:0)
我在没有你的配置的情况下在我的Ubuntu系统上尝试过你的样本,它提供了比我知道更多的完成。我猜测Semantic不知道某些包含文件的位置,或者没有设置正确的预处理器符号。
如果你这样做:
M-x load-library RET semantic/analyze/debug RET
然后您可以将光标放在样品上并执行:
M-x semantic-analyze-debug-assist RET
它会给你一堆提示,以及试图深入研究问题的其他命令。
我知道您在设置中设置了所有包含和预处理器文件。那部分对我来说似乎没问题。
semantic / bovine / gcc.el中的代码应该向您的GCC查询您提供的用于查找STL标头之类的信息的类型。编译器提供了STL头使用的某些#define值,可能不在您为预处理器符号提供的其他ming头中。
不幸的是,它为其尝试使用的C ++编译器提供了硬编码名称。如果您的编译器有其他名称,则可能需要编辑gcc.el源文件才能使其正常工作。如果您这样做,请发送电子邮件至cedet-devel邮件列表,以便我们在CEDET中进行更改。
或者,在string.h文件的任何位置加载,并找到它应该用于完成的定义。看看哪些#if语句将其过滤掉,然后使用:
M-x语义 - 描述 - 环境RET
了解这可能是如何相关的。