使用JLine在一行上完成多个命令

时间:2016-01-25 15:58:50

标签: java jline

我想知道如何实现ArgumentCompleter,这样如果我完成一个完整且有效的命令,那么它将开始完成新命令的选项卡。

我原以为它可以构建成这样的东西:

final ConsoleReader consoleReader = new ConsoleReader()

final ArgumentCompleter cyclicalArgument = new ArgumentCompleter();
cyclicalArgument.getCompleters().addAll(Arrays.asList(
        new StringsCompleter("foo"), 
        new StringsCompleter("bar"), 
        cyclicalArgument));

consoleReader.addCompleter(cyclicalArgument);
consoleReader.readLine();

但是现在这在制表符完成第一个foo bar

后停止工作

有没有人熟悉图书馆,告诉我如何实施这个?或者有一种已知的方法可以做到这一点我错过了吗?这也是使用JLine2。

1 个答案:

答案 0 :(得分:4)

这是一项非常重要的任务: - )

由您正在使用的完成者处理。完成者的int main (void) { int numbers[10] = {1, 0, 0, 0, 0, 0, 0, 0, 0, 0}; int i, j; for (j = 0; j < 10; j++) { for (i = 0; i < j; i++) { numbers[j] += numbers[i]; } } for (j = 0; j < 10; j++) { printf ("%d ", numbers[j]); printf ("\n"); } return 0; } 方法只能用于搜索最后一个空白之后的内容。

如果您在图书馆的complete()查找示例:这根本没有完成,因此您将找不到完成,因为完成者搜索FileNameCompleter而不仅仅是{{1} }: - )

您必须自己实现能够找到input2的完成符。

此外,<input1> <input2>必须将您找到的内容附加到您已输入的内容中。

以下是更改默认<input2>的基本实现:

CompletionHandler

此处FileNameCompleter - protected int matchFiles(final String buffer, final String translated, final File[] files, final List<CharSequence> candidates) { // THIS IS NEW String[] allWords = translated.split(" "); String lastWord = allWords[allWords.length - 1]; // the lastWord is used when searching the files now // --- if (files == null) { return -1; } int matches = 0; // first pass: just count the matches for (File file : files) { if (file.getAbsolutePath().startsWith(lastWord)) { matches++; } } for (File file : files) { if (file.getAbsolutePath().startsWith(lastWord)) { CharSequence name = file.getName() + (matches == 1 && file.isDirectory() ? this.separator() : " "); candidates.add(this.render(file, name).toString()); } } final int index = buffer.lastIndexOf(this.separator()); return index + this.separator().length(); } 更改默认complete()的方法:

CompletionHandler