我正在使用 Apache Mina SSHD 编写一个简单的 ssh 服务器,并使用 JLine3 来处理输入和输出。
我正在测试自动暗示尾尖小部件:它有效,但不符合预期。
我得到了什么:
我想要什么:
我不知道为什么我没有得到上面的结果。
我关注了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_region
、save_cursor
、restore_cursor
和 cursor_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/