Статьи

Emacs Lisp: поиск источников Java

Исповедь: я действительно надеюсь, что кто-то скажет мне, что я делаю это неправильно. Я не могу поверить, что нет более легкого пути.

Я работаю с Clojure в Emacs почти каждый день. Навигация по источнику обычно довольно проста. Если я хочу перейти к определению функции, все, что мне нужно нажать, — M-.и, если я хочу вернуться назад, M-,делает свое дело. Это работает для Clojure, который я написал, а также для Clojure, который живет в библиотеках, на которые я ссылаюсь. Это нормально в большинстве случаев, но иногда мне нужно перейти к исходному тексту Java какой-то библиотеки, которую я использую. Здесь я не могу поверить, что никто другой не решил эту проблему. * Если я нахожусь в файле clj, мой курсор находится на классе Java, я не знаю ни одного способа легко перейти к определению класса ,

Контекст:Я использую рисдля управления зависимостями (на работе). У меня есть мои проекты для размещения источников ./the-project/lib/sources; поэтому следующее решение предполагает, что источники находятся в этом каталоге. Если вы используете Lein (для deps), я уверен, что источники находятся где-то на вашем локальном диске. Все, что вам нужно сделать, это изменить шрифт ниже, чтобы он указывал на ваш исходный каталог.

Кроме того, я использую Lein, поэтому у меня есть project.clj в корне моего проекта; Тем не менее, нет ничего особенного или обязательного в «project.clj». Вы также можете легко поместить файл this.is.a.project.root в корень вашего проекта и найти этот файл.

Следующий код выполнит поиск в ваших исходных jar-файлах для класса Java и откроет первое найденное совпадение (или без совпадения, если совпадение не найдено) 

(defun find-java-src ()
(interactive)
(er/mark-word)
(let* ((project-root (locate-dominating-file (file-name-directory (buffer-file-name)) "project.clj"))
(the-str (buffer-substring-no-properties (region-beginning) (region-end))))
(if project-root
(progn
(grep-string-in the-str
(concat project-root "lib/sources"))
(switch-to-grep)
(sit-for 0.25)
(search-forward (concat (expand-file-name project-root) "lib/sources/"))
(compile-goto-error)
(let* ((current-point (point)))
(search-forward-regexp ".*\.jar")
(switch-to-buffer (buffer-substring-no-properties current-point (point))))
(search-forward the-str)
(archive-extract))
(message (concat "no project.clj found at or below " (buffer-file-name))))))

Отказ от ответственности, я все еще начинающий Emacs LISP.

Предыдущий код довольно прост. В строке 3 используется область раскрытия, чтобы пометить любой класс Java, в котором находится или находится мой курсор. Вместо этого вы можете ввести слово, если хотите, эта страница должна помочь вам понять, как это сделать.
В строках 4 и 6 найдите и проверьте, где находится корень проекта.
Строка 8 (и 9) greps для строки (класс Java) в каталоге (мой исходный каталог).
Строка 10 переключается на результаты grep .
Строка 11 спит, ожидая возвращения результатов grep.
Строка 12 ищет вперед, ища первое совпадение.
Строка 13 открывает банку первого матча.
Строка 14 назначает текущую точку переменной с именем current-point.
Строка 15 ищет до конца имени банки.
Строка 16 захватывает имя банки и переключается на этот буфер.
Строка 17 поиска фляга в Dired буфера для имени класса.
Строка 18 открывает первое совпадение имени класса.
(Строка 19 сообщает вам, если ваш проектный корень не может быть определен).

Вот и все, теперь вы можете легко найти источник java (со случайным конфликтующим раздражением имен). Это не красиво, но это делает работу.

* Мне сказали, что несколько режимов Java хороши, если я могу легко использовать их для перехода от моего Clojure к Java, пожалуйста, оставьте ссылку на руководство, в которое я могу углубиться. Я предполагаю, что есть решения etags, но не ясно, каков наилучший путь. Я уверен, что есть простое решение для навигации по Java из Clojure, мне просто трудно найти его.