我在新的linux主机上重新安装了emacs 24.2.50,并基于magnars emacs配置启动了一个新的dotEmacs配置。由于我在之前的工作流程中使用了CEDET取得了一些成功,因此我开始配置它。但是,每当我加载C ++源文件时,都会有一些奇怪的行为。
[此部分已解决]
正如所料,语义解析所有包含的文件(并在初始设置期间解析由 semantic-add-system-include 变量指定的所有文件),但它会打印出如下所示的错误消息:< / p>
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等)之上而不是在模式行中打印类型的定义时,解析看起来并不真正起作用。像
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 是文件&amp;缓冲区I当前正在编辑, IndexMap 和 fXBetween 是文件I +#编辑所包含的文件中定义的类型/文件I&#包含的某个文件39; m编辑。
我还没有测试CEDET /语义的任何进一步功能,因为这个问题非常烦人。我的cedet配置可以找到here。
编辑:在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文件相关的问题here)。
答案 0 :(得分:6)
您需要更改您的init文件,以便它只执行一次CEDET加载,而不是在为每个.h / .hpp / .c / .cpp文件调用的挂钩中。您可以更改this config作为基础,并在following article中阅读更多内容。
你遇到的问题是因为Semantic试图分析头文件,当它试图打开头文件时,会再次调用它的初始化例程,并再次调用......
答案 1 :(得分:3)