10

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

[这部分已解决]
正如预期的那样,语义解析所有包含的文件(并且在初始设置期间解析由语义添加系统包含变量指定的所有文件),但它会打印出如下错误消息:

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/semantic 的任何其他功能,因为这个问题很烦人。我的 cedet 配置可以在这里找到。

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

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

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

4

2 回答 2

6

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

您遇到的问题是因为 Semantic 试图分析头文件,当它试图打开它们时,它的初始化例程被再次调用,一次又一次......

于 2012-11-04T18:32:46.210 回答
3

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

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

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

于 2012-11-05T13:34:58.497 回答