奇怪的语义错误

ele*_*kil 10 c++ emacs cedet emacs-semantic

我在一个新的linux主机上重新安装了emacs 24.2.50,并基于magnars emacs配置启动了一个新的dotEmacs 配置.由于我在之前的工作流程中使用了CEDET取得了一些成功,因此我开始配置它.但是,每当我加载C++源文件时,都会有一些奇怪的行为.

[本部分已解决]
正如预期的那样,语义解析所有包含的文件(并在初始设置期间解析由semantic-add-system-include变量指定的所有文件),但它会打印出如下所示的错误消息:

WARNING: semantic-find-file-noselect called for /usr/include/c++/4.7/vector while in set-auto-mode for /usr/include/c++/4.7/vector. You should call the responsible function into 'mode-local-init-hook'.

在上面的示例中,为STL向量打印错误,但是为我正在访问的文件和任何后续包含的文件所包含的每个文件打印相应的错误消息.因此,完成需要相当长的时间,不幸的是,重复该过程的任何类型我打开一个新的缓冲区.

[此问题也解决了]
此外,当我将点放在非c基本类型(即不是int,double,float等)之上而不是打印类型的定义时,看起来解析并不真正起作用. modeline一条错误消息

Idle Service Error semantic-idle-local-symbol-highlight-idle-function: "#<buffer DEPFETResolutionAnalysis.cc> - Wrong type argument: stringp, (((0) \"IndexMap\"))" Idle Service Error semantic-idle-summary-idle-function: "#<buffer DEPFETResolutionAnalysis.cc> - Wrong type argument: stringp, ((\"fXBetween\" 0 nil nil))"

其中DEPFETResolutionAnalysis.cc是我正在编辑的文件和缓冲区,而IndexMapfXBetween是我正在编辑的文件所包含的文件中定义的类型/我正在编辑的文件所包含的某个文件.

我没有测试CEDET /语义的任何进一步的功能,因为问题非常烦人.我的cedet配置可以在这里找到.

编辑:在Alex Ott的帮助下,我解决了第一个问题.这是由于我可怕的cedet初始化.请参阅他的第一个答案,了解配置CEDET的正确方法!
仍然存在问题Idle Service Error(当启用时global-semantic-idle-local-symbol-highlight-mode,永久发生,不仅在检查点上类型的定义时).
并且存在如何禁用站点方式的init文件问题.

EDIT2:我已经semantic-debug-idle-function在缓冲区中执行了问题并产生了~700kb [sic!]输出.看起来它正在对数据容器执行某些操作,根据它的外观,它包含有关解析文件中定义的所有符号的信息.因为我已经解析了一个相当大的包(~20Mb源文件),所以这个表相当大.可以语义处理数据库那么大或者这是不可能的,也是我问题的原因?

EDIT3:删除~/.semanticdb所有包含的内容并重新解析所有包含就可以了.我仍然需要禁用站点方式的init文件,但由于这与CEDET无关,我将关闭此问题(可以在此处找到与站点方式的init文件相关的问题).

Ale*_*Ott 6

您需要更改您的init文件,以便它只执行一次CEDET的加载,而不是在为每个.h/.hpp/.c/.cpp文件调用的钩子中.您可以将此配置更改为基础,并在以下文章中阅读更多内容.

您遇到的问题是因为Semantic正在尝试分析头文件,当它尝试打开它们时,会再次调用其初始化例程,并再次...


ele*_*kil 3

第一个问题通过正确配置 CEDET 得到解决,这在 Alex Ott 的主页上有描述上有描述。他的回答解决了第一个问题。他的答案中指定的配置文件是良好配置的良好开端;我已经使用相同的方法来配置 CEDET 以满足我的需要。

当我将 CEDET 从 1.1 更新到 bazaar(存储库)版本后,第二个问题就消失了,这在此处和 Alex 的文章中进行了解释。另外,必须删除目录的内容~/.semanticdb(其中包含语义数据库,我猜它已损坏)。

我要感谢 Alex Ott 的帮助,并在我寻找解决方案的整个过程中一直陪伴着我:)