如何在emacs语义中包含标准的jdk库?

时间:2010-11-13 17:19:31

标签: java emacs emacs-semantic

我正在使用Emacs 23.2。这是我加载语义的方式:

(setq semantic-default-submodes '(global-semantic-idle-scheduler-mode
                  global-semanticdb-minor-mode
                  global-semantic-idle-summary-mode
                  global-semantic-mru-bookmark-mode))
(semantic-mode 1)

因此,如果我创建一个简单的java文件并访问它,我将获得本地定义的方法和类的代码完成。但我无法弄清楚如何使语义识别jdk库。例如,如果我在String变量上尝试semantic-ia-complete-symbol,我会得到Cannot find types for 'String blah'

有谁知道如何将jdk库加载到semanticdb中,以便可以使用像String这样的标准对象类型的代码完成?

3 个答案:

答案 0 :(得分:3)

从CEDET 1.1开始,Semantic支持通过javap检索类信息。您需要将cedet-java-jdk-root变量设置为JAVA_HOME,并将semanticdb-javap-classpath变量填充到Java系统jar的路径列表中,如rt.jar等。

an article(俄语,但你可以得到translation)关于为Java完成设置语义 - 请查看更多详细信息。

答案 1 :(得分:1)

如果你解压缩在$ JAVA_HOME中找到的src.zip,你可以为你的java模式添加一个钩子,如下所示:

(add-hook 'java-mode-hook
  '(lambda ()
     (semantic-add-system-include (getenv "JAVA_HOME") 'java-mode)))

它使用Emacs 23.3和CEDET 1.1解决了我的问题。

答案 2 :(得分:0)

有一段时间没有尝试过CEDET,所以我会盲目地提出几个可以让你深入了解问题的问题。

  1. 我认为JDK正在你的道路上,而Emacs可以找到它吗?
  2. 既然JDK基本上是一堆没有源代码的jar文件,可以语义解析吗?示例:如果您创建自己的Class1.java,请将其编译为Class1.class,然后删除Class1.java,当您编写Class2.java并引用Class1中的某些方法时,可以语义找到它们吗?
  3. 您是否尝试过JDEE