我正在使用 Apache Mina SSHD 编写一个简单的 ssh 服务器,并且我正在使用 JLine3 来处理输入和输出。
我正在测试 Autosuggestion Tail Tip 小部件:它可以工作,但不如预期。
我得到什么:
我想要的是:
我不知道为什么我没有得到上面的结果。
我按照这个指南。
这是我的代码:
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;
}
}
提前致谢。