有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

我正在使用ApacheMina SSHD编写一个简单的ssh服务器,并使用JLine3处理输入和输出
我正在测试Autosuggestion尾部提示小部件:它可以工作,但并不像预期的那样

我得到的是:

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

提前谢谢


共 (1) 个答案

  1. # 1 楼答案

    如果问题是提示符下缺少状态栏,我猜这是因为您的终端没有创建它所需的功能。您的终端应该具有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;