java JLine3自动建议未按预期工作
我正在使用ApacheMina SSHD编写一个简单的ssh服务器,并使用JLine3处理输入和输出
我正在测试Autosuggestion尾部提示小部件:它可以工作,但并不像预期的那样
我得到的是:
我想要的是:
我不知道为什么我没有得到上面的结果
我跟着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 楼答案
如果问题是提示符下缺少状态栏,我猜这是因为您的终端没有创建它所需的功能。您的终端应该具有
change_scroll_region
、save_cursor
、restore_cursor
和cursor_address
功能,请参见org.jline.utils.Status行~44-59