понедельник, 7 мая 2012 г.

CEDET 1.1, Emacs и Java


Недавно вышедший Cedet 1.1 добавляет долгожданную поддержку импорта символов из jar-ок. Теперь Emacs предоставляет поддержку автодополнения кода java примерно на том же уровне, что и современные IDE.
Например, у нас есть класс My1:


Он используется в My2:


Обратите внимание, как flymake параллельно скомпилировал файл и подсветил ошибки. Если набрать “my.” и выполнить функцию semantic-ia-complete-symbol-menu (у меня она замаплена на Ctrl-Space), то Emacs выдаст такую подсказку:



Аналогично можно запрашивать подсказку по членам системных классов. Например, для StringBuilder:


Правда надо учитывать, что, во-первых, импорты “звёздочкой” не срабатывают, системных классов semanticdb-javap тоже не знает. Поэтому, если необходимы подсказки, то импорт классов из неймспейса java.lang нужно делать явно, как в моем примере.

Для того, чтобы заработали показанные выше механизмы, необходимо следующее:
  1. установленный пакет flymake;
  2. установленный пакет auto-complete;
  3. скачанный CEDET 1.1;
  4. Ну и конечно же, последний Emacs и java.

Конфигурация CEDET в .emacs :
(load-file "~/cedet/common/cedet.el")             ;; Подгрузить cedet
(global-semanticdb-minor-mode 1)                  ;; Инициализировать semanticdb
;; Загрузить поддержку авто-дополнения
(semantic-load-enable-gaudy-code-helpers)

(custom-set-variables             ;; Инициализация переменных, указывающих, где 
                                                      ;; установлена java
. . .
'(cedet-java-jdk-root "/opt/jdk")

 ;; Сюда нужно добавить все jar-ки, из
 ;; которых необходимо импортировать символы
'(semanticdb-javap-classpath '("/opt/jdk/jre/lib/rt.jar"))
. . .
)

Конфигурация flymake:
(require 'flymake)
(add-hook 'java-mode-hook 'flymake-mode-on)

(defun my-java-flymake-init ()
(list "javac" (list (flymake-init-create-temp-buffer-copy
'flymake-create-temp-with-folder-structure))))

(add-to-list 'flymake-allowed-file-name-masks '("\\.java$" my-java-flymake-init flymake-simple-cleanup))

Конфигурация auto-complete:
(require 'auto-complete-config)
(add-to-list 'ac-dictionary-directories "~/.emacs.d/ac-dict")
(ac-config-default)



11 комментариев:

  1. а конфигурация java-mode есть?

    ОтветитьУдалить
  2. Я его не конфигурировал, все итак работает.

    ОтветитьУдалить
  3. А на ваш .emacs можно взглянуть? Я вижу у вас нет jde, зато есть jtags. И как вы делаете сборку проекта на java?

    ОтветитьУдалить
  4. Честно говоря, сборку делаю не из emacs-а, в emacs я только код пишу. flymake умеет делать сборку на лету для подсветки ошибок -- вот и всё.

    ОтветитьУдалить
  5. Прикрутил. Теперь работает и cedet и jdee. А вот убунту у меня старая, flymake отсуствует :(

    ОтветитьУдалить
  6. flymake -- это emacs-пакет, можешь взять его с мармелада.

    ОтветитьУдалить
  7. круто! а ято думал, что у emacs'а с java будет все плохо еще лет 30)

    ОтветитьУдалить
  8. btw, в текущей версии, cedet умеет дополнять встроенные классы и без явных импортов...

    ОтветитьУдалить
  9. Emacs 24.1, Cedet - текущий снапшот. Работает автодополнение только для методов классов локального проекта (не берет из rt.jar). Чтобы вы посоветовали?

    ОтветитьУдалить