30.10.12

Новая версия статьи про CEDET

Только что залил на сайт новую версию своей статьи про настройку CEDET. Я также оставил доступной старую версию статьи, но в виде отдельной страницы.
Новая версия описывает новую схему расположения исходного кода, а также новый способ активации под-режимов, так что статья теперь применима и к версии из bzr, и к версии идущей в составе GNU Emacs (после того как выпустят новую его версию).
Кроме того, я добавил небольшое описание того, как настроить связку CEDET + Java, а также небольшое описание настройки дополнений через auto-complete.

Вместо моего конфига, который очень уж сильно замусорен, теперь лучше воспользоваться отдельным конфигом.

P.S. кстати, в последних снапшотах, CEDET умеет находить проекты Maven, и получать информацию о classpath прямо из них, так что теперь работает и дополнение имен для классов из сторонних библиотек.  Например, вот так (Это дополнение при работе с кодом Apache Tika):


P.P.S. If you found error, or typo - please write comment on page, or fork source code on github (it's enough to fix only .muse file), and create pull request :-)

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

int.256h комментирует...

Большое спасибо. Я только недавно пытался осилить CEDET, руководствуясь первой версией вашей статьи.

VK комментирует...

Алекс,

спасибо за ваши статьи по Емасу, я давно за ними слежу и пользуюсь, особенно теми, в которых вы освещаете работу с CEDET; да и за, собственно, код для проекта тоже стоит поблагодарить. Эрик ощутимо не справлялся со всем, а сейчас, наконец, появились сдвиги в Джаве.

У меня несколько вопросов и замечаний по поводу настройки джавы:

1. вы забыли указать, что для работы javap помимо cedet-java надо включить пакет semantic/db-javap - без этого не парсились *.jar

2. не совсем понятно, в какой момент должен определиться путь до rt.jar при помощи свежедобавленной функции. У меня автодополнение из JDK заработало только после прямого указания пути к файлу в classpath

3. Ну и просто баги-баги-баги везде :) Я готов постить их и патчи для простейших из них, если сейчас кто-либо сконцентрированно занимается темой Джавы.

PS: Ubuntu 12.04, Emacs 21.1.1, Cedet из trunk самый последний (1 ноября)

Alex Ott комментирует...

Спасибо за комментарии:

1. Да - это мой прокол, мне казалось что там есть autoloads, но на самом деле их там нет - я подумаю как сделать это полностью автоматическим. Исправил в статье

2. Это происходит при первом вызове функции получения имен которая реализована в db-javap, там список jar'ов для поиска состовляется из core jar, ede-classpath + ede-project-classpath...

3. ну как без этого, багов полно - да. Я планирую сделать рефакторинг JVM-based проектов, так что можно будет добавить туда и clojure & scala, ну и подумать как использовать общие источники информации.

Баги и патчи лучше постить, я надеюсь что у меня будет время с ними разбираться (все-таки уже зима, времени свободного стало больше :-)

Большое спасибо!

VK комментирует...

Алекс,

я отправил комментарий по первой из найденных ошибок на semantic-devel. Было бы здорово ее поправить - там буквально несколько символов -, потому что именно этот функционал вы только что заявили в блоге :)

Alex Ott комментирует...

я посмотрю (скорее всего завтра), но я что-то не вижу письма, да и такого списка рассылки нет :-) есть cedet-devel & cedet-semantic

VK комментирует...

А, ну да, cedet-semantic, конечно.

Я не участник рассылки, поэтому письмо на премодерацию отправлено.

Мораль письма, если в двух словах(см. semantic/db-javap.el:835):

core-jar - строка, а append, что собирает списки jar, склеивает списки.

Там получается, что результирующий список состоит из символов строки core-jar плюс путей до остальных jar. Символы игнорируются ниже по коду, остальные jar подхватываются правильно.

Alex Ott комментирует...

моя бага, да - сейчас закоммичу фикс...

VK комментирует...

Простие за настырность :) Еще одна ошибка в доке, забыл упомянуть:

При объявлении Java-проекта вы приводите в качестве примера не относительный путь, а абсолютный.

:localclasspath '("/relative/path.jar")

Не уверен, баг это или нет, но CEDET считает путь абсолютным и, разумеется, ничего не находит по адресу.

Alex Ott комментирует...

оно должно работать также как и в ede-cpp-project - это "абсолютный" путь относительно корня проекта. Если оно так не работает, то это баг. Сейчас найду у себя не Maven project и попробую воспроизвести...

VK комментирует...

в смысле, абсолютный путь вида /path/to/some.jar CEDET вполне резонно считает абсолютным, а не относительным от корня проекта. Т.е. это либо ошибка дока, либо, если допустимо нормализовывать путь, CEDET

Alex Ott комментирует...

сейчас попробую поправить...
в cpp-project, локальный путь может быть "абсолютным" - относительно корня проекта, или "локальным" - относительно текущего буфера

VK комментирует...

Ну и еще такой вопрос, раз уж разговор пошел. Вообще, мне интересно это было самому сделать и оформить патчем, но нужна консультация.

В Java во всех контекстах всегда доступны классы и интерфейсы из пакета java.lang.*, Cedet в настоящий момент этого не знает. Мне интересно было бы погрузиться во внутреннюю механику проекта, чтобы иметь в дальнейшем возможность самостоятельно формировать патчи, и данная задача выглядит подходящей для начала.

С какого конца к этой задаче надо бы подходить? У вас нет по этому поводу идей-мыслей-рекомендаций?

Быть, отошлете к соответствующему доку?

Alex Ott комментирует...

пофиксил проблему с абсолютным путем в localclasspath...

Alex Ott комментирует...

Насчет этой проблемы я сам думаю, и пока не знаю как правильно ее решить... Т.е. надо для любого исходника на яве, выполнять инъекцию базовых классов.

Насчет документации не скажу - я сам не такой уж специалист во внутренностях CEDET и потихоньку разбираюсь читая исходники :-)

VK комментирует...

...причем выполнять ее только в том случае, если найден JDK. Ну ладно, тогда буду смотреть код.

Приятного рабочего дня!

VK комментирует...

Алекс,

мне уже неловко. :-)

Если путь все же указать относительный (что может придти в голову разработчику, в конце концов, названия директорий с кодом указываются без слеша), то обрезается первый символ. Думаю, там надо проверять, есть ли ведущий слеш и резать его только в случае наличия.

Alex Ott комментирует...

я до конца недели выходной :-)

Alex Ott комментирует...

для localclasspath так и сделано...

VK комментирует...

Перепроверил.

:localclasspath '("lib/automaton.jar")

превратился в

Classpath: "/home/vova/tmp/cedet-test/ib/automaton.jar" not found

VK комментирует...

проверил eval'ом

(if (compare-strings "lib/automaton.jar" 0 1 "/" 0 1) (message "off with her head") (message "let her live"))

дает в итоге сообщение "off with her head" :)


VK комментирует...

compare-string возвращает число, а число будет для if non-nil

VK комментирует...

У меня тоже выходной вечер выдался, поэтому и решил потестить свежий cedet во имя общего блага. :)

Alex Ott комментирует...

да, это была плохая идея использовать compare-string... закоммитил фикс :-)

VK комментирует...

Алекс,

я отправил в cedet-devel дифф с решением java.lang.* в рассылку.

Прежде чем он пройдет модерацию, хотелось вам задать пару вопросов, как коммитеру:

1. каковы процедуры отправки патчей в проекте?

2. кого принимают в рассылку? а то модерация может занимать довольно много времени, хотелось бы получать фидбэк быстрее.

Alex Ott комментирует...

Спасибо, завтра гляну - кинь мне его отдельным письмом.

Для сабмита патчей надо будет подписать стандартное соглашение о передаче прав на код в FSF - поскольку cedet входит в состав емакс

В рассылку принимают всех - надо подписаться на sourceforge. Модерация делается только для не подписанных на рассылку

VK комментирует...

Алекс,

1. дифф отправил, буду рад комментариям и соображениям по исправлению

2. ясно, спасибо, я отправлял письма не с адреса, который включил в подписку :)