Консольный инструмент, аналогичный ctags или cscope для разработки на Java.

Вопрос или проблема

Инструмент командной строки, похожий на 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 без запуска процессов, работающих в фоновом режиме. Это особенно полезно для разработчиков, предпочитающих легковесные текстовые редакторы и желающих изучать сам принцип построения таких индексов.

Примеры

  1. Exuberant Ctags для Java: Хотя ctags более известен для языков C и C++, он также поддерживает Java. Этот инструмент может использоваться для создания индекса тегов из файлов .java, что позволит вам находить определения классов и методов, хотя его возможности могут быть несколько ограниченными по сравнению с возможностями полноценных IDE.

  2. JDepend и Java NCSS: Хотя эти инструменты часто применяются для анализа кода, они также могут быть настроены для создания отчётов, которые включают в себя основную информацию о структуре проекта Java. Это может быть полезно для быстрого получения информации о вашем коде без запуска дополнительных процессов.

  3. SouJava или Java Tags: Эти инструменты представляют собой специализированные решения, ориентированные на анализ и индексирование Java-кода без активного фона. Они предложат немного больше гибкости в конфигурации и подходящие для Java среды.

Применение

Для реализации указанной функциональности вы можете начать с самых простых решений, таких как расширение ctags для поддержки Java:

ctags -R --languages=Java --extra=+q --fields=+KSn

Эта команда вызова ctags будет рекурсивно индексировать ваш проект на языке Java, создавая и обновляя при этом файл тегов, который можно использовать в большинстве редакторов, поддерживающих интеграцию с ctags.

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

Заключение

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

Оцените материал
Добавить комментарий

Капча загружается...