我正在尝试让JLine完成制表符,因此我可以输入以下内容:
commandname --arg1 value1 --arg2 value2
我使用以下代码:
final List<Completor> completors = Arrays.asList(
new SimpleCompletor("commandname "),
new SimpleCompletor("--arg1"),
new SimpleCompletor("--arg2"),
new NullCompletor());
consoleReader.addCompletor(new ArgumentCompletor(completors));
但在我输入value2标签后,完成停止。
(补充问题,我可以使用jline将value1验证为日期吗?)
答案 0 :(得分:3)
我遇到了同样的问题,我通过创建自己的类来解决它,以使用jLine完成命令。我只需要实现自己的Completor。
我正在开发一个应用程序,可以帮助DBA不仅键入命令名称,还可以键入参数。我正在使用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,以改进向用户呈现选项的方式。
完整的代码可用here。
答案 1 :(得分:0)
创建2个completors,然后使用它们来完成arbituary参数。请注意,并非所有参数都需要完成。
List<Completer> completors = new LinkedList<>();
// Completes using the filesystem
completors.add(new FileNameCompleter());
// Completes using random words
completors.add(new StringsCompleter("--arg0", "--arg1", "command"));
// Aggregate the above completors
AggregateCompleter aggComp = new AggregateCompleter(completors);
// Parse the buffer line and complete each token
ArgumentCompleter argComp = new ArgumentCompleter(aggComp);
// Don't require all completors to match
argComp.setStrict(false);
// Add it all together
conReader.addCompleter(argComp);
答案 2 :(得分:0)
删除NullCompletor,你会得到你想要的。 NullCompletor确保您的整个命令只有3个字。