用jline预填充一条线

时间:2012-09-04 17:24:16

标签: java readline jline

使用JLine(或JLine2),是否可以在readline上发出对ConsoleReader的调用,并且除了标准提示之外,还要预先用字符串填充缓冲区我的选择?

我试过这样做,例如:

reader.getCursorBuffer().write("Default");
reader.readLine("Prompt> ");

这似乎确实写入了缓冲区,但该行只显示提示符。如果按Enter键,readLine会像我预期的那样返回"Default"。如果我清除屏幕,则会重新绘制缓冲区并正确显示。

我的理解是,在调用reader.redrawLine()之后我应该以某种方式呼叫readLine。然而,最后一个是阻塞,这使得它很难(不是不可能,但使用第二个线程肯定是错误的。)

4 个答案:

答案 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)

如果您已经设置了提示,我认为您需要resetPromptLineputStream

不要劫持你的问题,但是我无法弄清楚如何简单地打印一条替换提示的行(表面上或者通过上面的消息以可视方式推动提示)。

答案 3 :(得分:0)

JLine3的更新:

这可以通过readLine的现有重载之一来实现:

readLine(String prompt, Character mask, String buffer)

例如,reader.readLine("> ", null, "abc")将产生> abc,其中abc是正在编辑的缓冲区的一部分。