Java Есть ли какие-либо известные библиотеки для завершения вкладки каталога? - PullRequest
2 голосов
/ 29 марта 2012

Я хотел бы создать программу в среде linux / unix, которая запускается из командной строки.Желаемый результат будет иметь возможность вкладывать полные каталоги.Есть ли библиотеки для этого?

Сводка: / ho [tab] / home /

Ответы [ 6 ]

2 голосов
/ 29 марта 2012

Существует библиотека JNI для библиотеки GNU readline (которую Bash использует для завершения табуляции);см. http://sourceforge.net/projects/java-readline/. Завершение табуляции - это общая функция, не привязанная специально к файловой системе - например, клиент командной строки PostgreSQL использует завершение табуляции для завершения имен таблиц - поэтому вы, вероятно, захотите использовать этов сочетании с PrefixFileFilter, который упоминает Томаш Нуркевич (или другой аналогичный подход для генерации списка имен файлов).

2 голосов
/ 29 марта 2012

PrefixFileFilter из IO может быть полезно:

File dir = new File(".");
String[] files = dir.list(new PrefixFileFilter("ho"));

Возвращается список файловтекущий каталог, начинающийся с ho.Вы получите все остальное.

1 голос
/ 06 сентября 2017

Вы можете использовать последнюю версию JLine.
Последняя версия доступна от https://github.com/jline/jline3. Он предоставляет встроенные завершители для каталогов и файлов.

1 голос
/ 29 марта 2012

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

  • File[] listFiles()
  • boolean isDirectory()
  • boolean isFile()
  • ...

Тогда вам просто нужно создать:

  • выберите временный путь, например, "/home/Ja"
  • разделить его между последней конкретной деталью и деталью для завершения, /home и Ja
  • список файлов из конкретной детали new File("/home").listFiles()
  • и выберите только текущий правильный для partial file.getName().startsWith("Ja")

Я думаю, это будет около 50-100 LOC, включая все проверки, необходимые, чтобы избежать странных вещей.

Если вам нужен хороший подход, используйте FilenameFilter, чтобы вы могли отфильтровывать файлы непосредственно при вызове listFiles, например

files = folder.listFiles(new PartialFileFilter("Ja"))
0 голосов
/ 27 августа 2017

JLine, вероятно, больше не поддерживается, но есть еще немало Java-проектов, которые его используют:

http://jline.sourceforge.net/index.html

Однако, если вы знаете, что хотите использовать Linux / Unix, и единственное, что вам нужно, это простые имена файлов / каталогов, вы можете просто перенести проблему и запустить свое Java-приложение под rlwrap:

$ rlwrap -c java ...
0 голосов
/ 27 августа 2017

Существуют ли библиотеки Java для создания приложений командной строки с завершением TAB каталогов?

Вас может заинтересовать picocli .Picocli - это однофайловая библиотека Java для создания приложений командной строки с практически нулевым кодом;он может генерировать цветные справочные сообщения об использовании ANSI, а picocli поддерживает автозаполнение командной строки в Linux (и Cygwin и babun в Windows) начиная с версии 1.0.

Как это работает?Оболочки Unix bash и zsh предоставляют нечто, называемое «программируемое завершение», и picocli использует это для генерации сценария автозаполнения, адаптированного к аннотациям @Option и @Command в вашем приложении.

С установленным сценарием пользователиможно ввести клавишу TAB, и оболочка Unix покажет список доступных подкоманд и параметров.Для параметров, связанных с полем java.io.File или java.nio.file.Path, оболочка покажет доступные файлы и каталоги, которые соответствуют тому, что пользователь вводил до сих пор.

На самом деле это обрабатывает не только файлы и каталоги: сгенерированный Picocli скрипт завершения показывает известные хосты (из файла /etc/hosts пользователя) для параметров типа java.net.InetAddress и показывает значения enum для параметровна полях любого типа перечисления, включая пользовательские перечисления.

Анимация ниже демонстрирует, что возможно.

enter image description here

...