我在新的 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是我当前正在编辑的文件和缓冲区,IndexMap和fXBetween是在我正在编辑的文件/我正在编辑的文件中包含的文件中定义的类型。
我没有测试 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 无关,我将关闭此问题(与站点级初始化文件相关的问题可以在此处找到)。