java - JLine3 - 自动建议未按预期工作

标签 java ssh jline3

我正在使用 Apache Mina SSHD 编写一个简单的 ssh 服务器,并使用 JLine3 来处理输入和输出。
我正在测试自动暗示尾尖小部件:它有效,但不符合预期。

我得到了什么:

enter image description here

我想要什么:

asciicast

我不知道为什么我没有得到上面的结果。
我关注了this guide

这是我的代码:

public class ChatHandler implements Command, Runnable {
    private LineReader input;
    private Terminal output;
    private InputStream in;
    private OutputStream out;
    private ExitCallback callback;
    @Override
    public void run() {
        output.puts(Capability.clear_screen);
        for(int i=0;i<output.getHeight();i++)
            input.printAbove("");
        while (true)
        {
            input.readLine("Enter a line: ");
        }
    }
    @Override
    public void start(ChannelSession channel, Environment env) throws IOException {
        output = TerminalBuilder.builder()
                .system(false)
                .streams(in, out)
                .encoding(StandardCharsets.UTF_8)
                .size(new Size(Integer.parseInt(env.getEnv().get(Environment.ENV_COLUMNS)),
                        Integer.parseInt(env.getEnv().get(Environment.ENV_LINES))))
                .build();
        input = LineReaderBuilder.builder()
                    .completer(new AggregateCompleter(new ArgumentCompleter(Arrays.asList(
                               new StringsCompleter("/signin"),
                               new OptionCompleter(Arrays.asList(
                                       new StringsCompleter("username"),
                                       NullCompleter.INSTANCE),Collections.singleton(new OptDesc(null, null,"Register user")),1)))))
                    .terminal(output)
                    .option(Option.INSERT_BRACKET,true)
                    .option(Option.ERASE_LINE_ON_FINISH,true)
                    .option(Option.CASE_INSENSITIVE,true)
                    .variable(LineReader.SECONDARY_PROMPT_PATTERN,"")
                    .variable(LineReader.INDENTATION,4)
                    .build();

        Map<String, CmdDesc> tailTips = new HashMap<>();
        Map<String, List<AttributedString>> widgetOpts = new HashMap<>();
        List<AttributedString> mainDesc = Arrays.asList(new AttributedString("/signin username")
                               );
        widgetOpts.put("username", Arrays.asList(new AttributedString("Register user")));

        tailTips.put("/signin", new CmdDesc(mainDesc, ArgDesc.doArgNames(Arrays.asList("username")), widgetOpts));
        TailTipWidgets tailtipWidgets = new TailTipWidgets(input, tailTips,5,TipType.COMPLETER);
        tailtipWidgets.enable();

        InputRC.configure(input,ChatHandler.class.getResourceAsStream("/resources/keybind"));
        new Thread(this).start();
    }

    @Override
    public void destroy(ChannelSession channel) throws Exception {
    }

    @Override
    public void setInputStream(InputStream in) {
        this.in = in;
    }

    @Override
    public void setOutputStream(OutputStream out) {
        this.out = out;
    }

    @Override
    public void setErrorStream(OutputStream err) {
    }

    @Override
    public void setExitCallback(ExitCallback callback) {
        this.callback = callback;
    }
}

提前致谢。

最佳答案

如果问题是提示下方缺少状态栏,我猜这是因为您的终端不具备创建它所需的功能。您的终端应该具有 change_scroll_regionsave_cursorrestore_cursorcursor_address 功能,请参阅 org.jline.utils.Status第 44-59 行。

        this.supported = terminal.getStringCapability(Capability.change_scroll_region) != null
            && terminal.getStringCapability(Capability.save_cursor) != null
            && terminal.getStringCapability(Capability.restore_cursor) != null
            && terminal.getStringCapability(Capability.cursor_address) != null;

关于java - JLine3 - 自动建议未按预期工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61756802/

相关文章:

java - 列表<?扩展基础> VS 列表<基础>

java - Hibernate逆向工程

java - 使用java在远程Linux机器上运行bash文件并将其保留在后台

java - 构建后 JLine3 "Unable to create a system terminal"

java - 如何通过 jline3 在每行前面添加字符串?

java - 如何使用java从任务管理器中隐藏正在运行的进程?

java - 跟踪复杂过程的部分结果的设计模式

perl - 哪个 Perl ssh 模块支持 kerberos 身份验证?

go - 使用 ssh 和交互式 shell 时如何模拟按键