我正在尝试让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验证为日期吗?)

最佳答案

我遇到了同样的问题,我通过创建自己的类以使用jLine完成命令来解决了这个问题。我只需要实现自己的Completor。

我正在开发一个可以帮助DBA不仅键入命令名称而且还键入参数的应用程序。我仅将jLine用于终端交互,并创建了另一个Completor。

我必须向完成者提供完整的语法,这就是我的应用程序的目标。它称为Zemucan,托管在SourceForge中。该应用程序最初专注于DB2,但是可以合并任何语法。我正在使用的完成器的示例是:

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

10-06 13:33