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