使用JLine(或JLine2),是否可以在readline
上发出对ConsoleReader
的调用,并且除了标准提示之外,还要预先用字符串填充缓冲区我的选择?
我试过这样做,例如:
reader.getCursorBuffer().write("Default");
reader.readLine("Prompt> ");
这似乎确实写入了缓冲区,但该行只显示提示符。如果按Enter键,readLine
会像我预期的那样返回"Default"
。如果我清除屏幕,则会重新绘制缓冲区并正确显示。
我的理解是,在调用reader.redrawLine()
之后我应该以某种方式呼叫readLine
。然而,最后一个是阻塞,这使得它很难(不是不可能,但使用第二个线程肯定是错误的。)
答案 0 :(得分:1)
我今天遇到了这个用例。
这有点像黑客,但我能够将文本预加载到JLine缓冲区中,然后让用户通过这样做来编辑它:
String preloadReadLine(ConsoleReader reader, String prompt, String preload)
throws IOException
{
reader.resetPromptLine(prompt, preload, 0);
reader.print("\r");
return reader.readLine(prompt);
}
是的,\r
的打印是一个黑客,但它似乎使事情有效。
我使用的是JLine-2.13。
答案 1 :(得分:1)
我设法使用一个线程(是的,它确实感觉不对,但我找不到其他方法)。
我从代码in JLine itself中获取灵感,该代码也使用了一个类似的线程。
在Scala中:
val thr = new Thread() {
override def run() = {
reader.putString("Default")
reader.flush()
// Another way is:
// reader.getCursorBuffer.write("Default") // writes into the buffer without displaying
// out.print("D*f*ult") // here you can choose to display something different
// reader.flush()
}
}
thr.setPriority(Thread.MAX_PRIORITY)
thr.setDaemon(true)
thr.start()
答案 2 :(得分:0)
如果您已经设置了提示,我认为您需要resetPromptLine
或putStream
。
不要劫持你的问题,但是我无法弄清楚如何简单地打印一条替换提示的行(表面上或者通过上面的消息以可视方式推动提示)。
答案 3 :(得分:0)
JLine3的更新:
这可以通过readLine
的现有重载之一来实现:
readLine(String prompt, Character mask, String buffer)
例如,reader.readLine("> ", null, "abc")
将产生> abc
,其中abc
是正在编辑的缓冲区的一部分。