0

我正在使用 Apache Mina SSHD 编写一个简单的 ssh 服务器,并且我正在使用 JLine3 来处理输入和输出。
我正在测试 Autosuggestion Tail Tip 小部件:它可以工作,但不如预期。

我得到什么:

在此处输入图像描述

我想要的是:

asciiccast

我不知道为什么我没有得到上面的结果。
我按照这个指南

这是我的代码:

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;
    }
}

提前致谢。

4

1 回答 1

0

如果问题是提示下方缺少状态栏,我猜是因为您的终端没有创建它所需的功能。您的终端应该具有change_scroll_regionsave_cursor和功能,请参阅restore_cursororg.jline.utils.Status~44-59。cursor_address

        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;
于 2020-05-13T17:09:20.277 回答