我想知道如何实现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。
答案 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