Вопрос или проблема
Инструмент командной строки, похожий на ctags
или cscope
для разработки на Java.
В основном мне интересно, какие нек-LSP инструменты существуют для получения автодополнения и перехода к определению, чтобы это примерно работало с такими инструментами, как vim
или emacs
. Эргономичная работа с любым из инструментов не является обязательной. Например, cscope
в общем случае требует либо плагина, либо вызывает ваш редактор в результате поиска.
Я инженер-программист, и в основном работаю с языками Go, bash и Python. В свободное время использую OCaml, Coq и немного C.
Но недавно я начал изучать Java, в основном с точки зрения хобби, и мне интересно, есть ли какие-либо способы получить базовые функции поиска символов и автодополнения в простом редакторе с помощью инструмента похожей сложности и жизненного цикла, как у ctags
или cscope
.
Я понимаю, что существует много LSP для Java, но меня в первую очередь интересуют инструменты, которые строят какой-то индекс и не имеют демона или другого процесса, с которым мой редактор должен постоянно взаимодействовать. Я не против LSP (я все время использую gopls
), но хочу исключить его для этой задачи, потому что хочу изучить реализацию инструмента, строящего индекс, если такой существует, и нужен инструмент с быстрым временем запуска (кроме построения индекса).
В качестве быстрого примера, вот быстрый и грязный скрипт оболочки, который находит много классов Java в /usr
или в кеше Maven, независимо от того, хранятся ли они в виде файлов .java
, .class
, в .jar
или в .jmod
.
#!/bin/bash
quot="'"
awkbegin="$quot"
awkend="$quot"
export LC_ALL=C
# Находить все, что похоже на класс Java в стандартной директории установки на Linux для системных пакетов (/usr)
# , в кеше maven ~/.m2 или в текущей рабочей директории
find ~/.m2 /usr . \( -name '*.java' -print \) -o \
\( -name '*.class' -print \) -o \
\( -name '*.jar' -exec /bin/sh -c 'jar -tf "$1" | awk -vj="$1" '"$awkbegin"' { printf("JAR %s %s\n", j, $0); } '"$awkend" sh '{}' \; \) -o \
\( -name '*.jmod' -exec /bin/sh -c 'strings "$1" | grep "\.class$" | awk -vm="$1" '"$awkbegin"' { printf("JMOD %s %s\n", m, $0) } '"$awkend" sh '{}' \; \) | sort > ~/javaclasslist.txt
Эта штука почти удобна для использования, поскольку путь к классу, либо на диске, либо внутри файла jar или jmod, связан с именем пакета и класса, и, если все станет плохо, я могу просто добавить jar в мой classpath.
Ответ или решение
Для Java-разработки, особенно когда вы ищете инструменты, аналогичные ctags
или cscope
, которые могут обеспечить базовое автодополнение и переход к определению символов без использования языковых серверов (LSP), существует несколько решений, которые можно рассматривать. Эта потребность возникает часто, если вы работаете в минималистичных средах, таких как vim
или emacs
, и хотите иметь быстрый и легковесный инструмент, который не требует постоянного взаимодействия с фоновым процессом. Важно подчеркнуть, что такие инструменты строят своего рода индекс, который позволяет вам мгновенно обращаться к нему в вашем редакторе.
Теория
ctags
и cscope
для языков, таких как C и C++, представляют собой мощные средства для анализа исходного кода, создания списка тегов и навигации по проекту. Они работают, индексируя файлы проекта и создавая файл тегов или базу данных, которую затем можно использовать для поиска и перехода к определению символов. Это позволяет избегать необходимости в сложных фоновых процессах, таких как серверы языка (LSP), обеспечивая быстрый доступ к информации.
Аналогичный функционал для Java может быть обеспечен инструментами, которые способны индексировать классы и файлы Java без запуска процессов, работающих в фоновом режиме. Это особенно полезно для разработчиков, предпочитающих легковесные текстовые редакторы и желающих изучать сам принцип построения таких индексов.
Примеры
-
Exuberant Ctags для Java: Хотя
ctags
более известен для языков C и C++, он также поддерживает Java. Этот инструмент может использоваться для создания индекса тегов из файлов.java
, что позволит вам находить определения классов и методов, хотя его возможности могут быть несколько ограниченными по сравнению с возможностями полноценных IDE. -
JDepend и Java NCSS: Хотя эти инструменты часто применяются для анализа кода, они также могут быть настроены для создания отчётов, которые включают в себя основную информацию о структуре проекта Java. Это может быть полезно для быстрого получения информации о вашем коде без запуска дополнительных процессов.
-
SouJava или Java Tags: Эти инструменты представляют собой специализированные решения, ориентированные на анализ и индексирование Java-кода без активного фона. Они предложат немного больше гибкости в конфигурации и подходящие для Java среды.
Применение
Для реализации указанной функциональности вы можете начать с самых простых решений, таких как расширение ctags
для поддержки Java:
ctags -R --languages=Java --extra=+q --fields=+KSn
Эта команда вызова ctags
будет рекурсивно индексировать ваш проект на языке Java, создавая и обновляя при этом файл тегов, который можно использовать в большинстве редакторов, поддерживающих интеграцию с ctags
.
Если вам нужен более сложный анализ, вы можете рассмотреть возможность использования JDepend
в сочетании со скриптами для создания гиперссылок или других инструментов, которые смогут помочь сгруппировать и структурировать данные для ваших нужд.
Заключение
Ваше желание использовать подходы, основанные на индексации, а не постоянно работающие процессы — вполне оправданное. Это позволяет сохранить простоту и легкость в работе с проектами, оказывая минимальное влияние на производительность системы. Описанные подходы демонстрируют различные способы индексации Java-кода и предоставляют вам выбор в инструментах, которые могут удовлетворить ваши потребности. Надеюсь, что это руководство поможет вам подобрать наиболее подходящий инструмент для ваших задач и окружения разработки.