4 сентября 2013 г.

Emacs + Java

Появилась у меня в последнее время необходимость основательно познать Java. Очень долго не смотрел в его сторону, были у меня некоторые предубеждения. Я всегда думал, что plain C и Lisp это наше все. И этого достаточно. А сейчас работа повернулась стороной с Java лицом и соответственно захотел быстренько познать его особенности, а также настроить свой любимый редактор для удобной работы с этим популярным языком программирования.

Для каждого языка программирования в Emacs я стараюсь настроить следующие возможности:

  • Подсветка синтаксиса (есть из коробки)
  • Авто дополнения (желательно через auto-complete)
  • Навигация по коду
  • Работа с проектами (опционально, люблю работать в консоли вне Emacs)
  • REPL (также опционально, но очень помогает во время обучения)

Из коробки в java-mode фактически работает только подсветка синтаксиса. Cedet идущий с Emacs'ом также позваляет настроить автодополнения и навигацию внутри классов. Но вот, например, системные вещи наотрез отказывается предлагать в качестве дополнений.

В общем я решил посмотреть, какие сейчас есть удобств для работы с Java в Emacs. При этом я наткнулся на следующие вещи:

Немного впечатлений о каждом расширении. Все пробовал на MacBook Air, OS X, Emacs 24.3.1 из MacPorts.

JDEE

Старое и похоже переставшее развиваться расширение. Сразу не понравилось, что тянет с собой свою цветовую схему. Мелочи, но они всегда бросаются в глаза. Также JDEE каким-то образом умудряется нарушить работу whitespace-mode, который перестает подсвечивать вообще что-либо. Данную проблему решить не смог. Есть у меня подозрение, что это связано с перекрашиванием буфера, но глубока не капал за ненадобностью. Нечто похожее сейчас есть в markdown-mode. Ну и каких-то особых возможностей здесь не нашел. Все плюшки сделаны через Cedet, соответственно их можно получить и без JDEE.

Malabar-mode

Завязан на Maven, про который ранее слышал совсем чуть-чуть и отдаленно. Быстренько глянул, как работать с этим менеджером проектов. Создал тестовый проект, но производительность malabar-mode вообще не порадовала. Он как я понял использует Groovy console для формирования дополнений. И это похоже порой не быстрый процесс. В общем от этого варианта тоже отказался. Кроме того проект также загибается. Хотя в знакомстве с malabar-mode есть свой плюс: я узнал что такое Maven и как с ним работать.

Eclime

Вот это вообще монстр. Идея затащить в Emacs (изначально в Vim) функционал Eclipse через некий интерфейс тоже на деле оказывается не шибко производительна. В данном случае eclime запускает Eclipse на заднем плане и общается с ним, чтобы получить автодополнения и еще некоторый функционал (рефакторинг, навигация по коду и т.п.). Скорость отзывчивости данной системы еще меньше, чем у Malabar.

Auto Java Complete

Смысл данного расширения прост: сгенерировать теги необходимых Java библиотек и предоставить интерфейс для auto-complete. Я попробовал использовать готовые теги и это работает достаточно быстро и удобно. Но тут мы получаем только информацию системных библиотек и того что сами укажем ручками при генерации тегов. В принципе в связке со стандартным Cedet идущим с Emacs'ом должно всего этого хватить.

Cedet Dev

Самый удобный, как мне кажется, вариант это использовать последнюю версию Cedet из Bazaar репозитория. Тут сейчас Java хорошо поддерживается. Maven проекты кстати тоже отлично воспринимаются. По работе и настройке Cedet лучше обращаться к статье Alex Ott'а.


На данный момент я остановился на последнем варианте: Cedet Dev + auto-complete. Есть у кого еще предложения как улучшить жизнь в Emacs при работе с Java? Или все таки Cedet это наше все и смотреть в другие стороны лучше не стоит?

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

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

Я в своей ветке разработки (https://github.com/alexott/cedet/tree/devel) допинываю потихоньку интеграцию с разными системами сборки - ant, maven, lein, rebar. Там сейчас пока больше чем в нормальном CEDET, так что можно пробовать. Я планирую слить это обратно в CEDET, но не знаю когда будет время.

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

кстати, я почему на яве, а не на Clojure? все ближе к лиспу ;-)

Ilya Zonov комментирует...

2 Alex

Интересно. Попробую твою ветку. Было бы еще везде все в одной системе контроля версий. bzr-git тут поможет? Плоховато знаком с Bazaar. Или git-bzr есть?

А Clojure это конечно клева. Но не получается все сразу узнавать и использовать. Всего по немногу. Может быть и до этого языка доберусь ) Я тут до кучи со Scala иногда балуюсь )

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

я втянул в git через git-bzr, мне просто нужно работать из нескольких мест, а с bzr это не всегда получается удобно

Ilya Zonov комментирует...

Ок, попробую на досуге разобраться с git-bzr. Хотя это наверное лишнее для того чтобы всего лишь попробовать твою ветку )

Хотя я нагородил себе такую хитрую структуру Emacs конфигов в связке с el-get (надо будет написать про это как-нибудь), что видимо будет полезно узнать как быстренько заэкспортировать что-то из bzr в git, и положить себе на git сервачок.