首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JLine3 -自动建议未按预期工作

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

Stack Overflow用户
提问于 2020-05-13 00:24:58
回答 1查看 251关注 0票数 0

我正在使用Apache Mina SSHD编写一个简单的ssh服务器,并使用JLine3处理输入和输出。

我正在测试Autosuggestion Tip小部件:它可以工作,但并不像预期的那样。

我得到的是:

我想要的:

我不知道为什么我得不到上面的结果。

我跟踪了this guide

这是我的代码:

代码语言:javascript
复制
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;
    }
}

提前谢谢。

EN

回答 1

Stack Overflow用户

发布于 2020-05-14 01:09:20

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

代码语言:javascript
复制
        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;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61756802

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档