У меня была та же проблема, и я решил ее, создав свои собственные классы для выполнения команд с помощью jLine. Мне просто нужно было реализовать свой собственный Completor.
Я разрабатываю приложение, которое может помочь администраторам баз данных вводить не только имена команд, но и параметры. Я использую jLine только для взаимодействия с Терминалом и создал еще один Completor.
Я должен предоставить полную грамматику Completor, и это является целью моего приложения. Он называется Zemucan и находится в SourceForge; это приложение изначально ориентировано на DB2, но может быть включена любая грамматика. Пример используемого Completor:
public final int complete(final String buffer, final int cursor,
@SuppressWarnings("rawtypes") final List candidateRaw) {
final List<String> candidates = candidateRaw;
final String phrase = buffer.substring(0, cursor);
try {
// Analyzes the typed phrase. This is my program: Zemucan.
// ReturnOptions is an object that contains the possible options of the command.
// It can propose complete the command name, or propose options.
final ReturnOptions answer = InterfaceCore.analyzePhrase(phrase);
// The first candidate is the new phrase.
final String complete = answer.getPhrase().toLowerCase();
// Deletes extra spaces.
final String trim = phrase.trim().toLowerCase();
// Compares if they are equal.
if (complete.startsWith(trim)) {
// Takes the difference.
String diff = complete.substring(trim.length());
if (diff.startsWith(" ") && phrase.endsWith(" ")) {
diff = diff.substring(1, diff.length());
}
candidates.add(diff);
} else {
candidates.add("");
}
// There are options or phrases, then add them as
// candidates. There is not a predefined phrase.
candidates.addAll(this.fromArrayToColletion(answer.getPhrases()));
candidates.addAll(this.fromArrayToColletion(answer.getOptions()));
// Adds a dummy option, in order to prevent that
// jLine adds automatically the option as a phrase.
if ((candidates.size() == 2) && (answer.getOptions().length == 1)
&& (answer.getPhrases().length == 0)) {
candidates.add("");
}
} catch (final AbstractZemucanException e) {
String cause = "";
if (e.getCause() != null) {
cause = e.getCause().toString();
}
if (e.getCause() != null) {
final Throwable ex = e.getCause();
}
System.exit(InputReader.ASSISTING_ERROR);
}
return cursor;
Это выдержка из приложения. Вы можете сделать простой Completor, и вы должны предоставить массив опций. В конце концов, вы захотите реализовать свой собственный CompletionHandler, чтобы улучшить способ представления опций пользователю.
Полный код доступен здесь .