6

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

我试过做,例如:

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

这似乎确实写入了缓冲区,但该行仅显示提示。如果我按回车键,将按预期readLine返回。"Default"如果我清除屏幕,缓冲区将重新绘制并正确显示。

我的理解是,我应该reader.redrawLine()在调用readLine. 然而,最后一个是阻塞的,这使得它很难(并非不可能,但为此使用第二个线程肯定感觉不对)。

4

4 回答 4

1

我今天正好遇到了这个用例。

这有点 hack,但我能够将文本预加载到 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。

于 2015-03-26T22:43:29.327 回答
1

我设法使用线程来做到这一点(是的,它确实感觉不对,但我没有找到其他方法)。

我从JLine 本身的代码中获得灵感,该代码也将线程用于类似目的。

在斯卡拉:

      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()
于 2015-11-24T13:38:11.173 回答
0

我认为您想要resetPromptLine或者putStream如果您已经设置了提示。

不要劫持您的问题,但我无法弄清楚如何简单地打印替换提示的行(表面上或视觉上将提示向下推,并在其上方显示一条消息)。

于 2013-05-17T18:37:06.777 回答
0

JLine3 更新:

这可以通过以下现有重载之一来完成readLine

readLine(String prompt, Character mask, String buffer)

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

于 2020-08-07T10:35:17.367 回答