用jline预填充一行



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

我试过做,例如:

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

这似乎确实写入了缓冲区,但这一行只显示了提示。如果我按enter键,readLine会按我所期望的那样返回"Default"。如果我清除屏幕,缓冲区将被重新绘制并正确显示。

我的理解是,我应该在呼叫readLine之后立即以某种方式呼叫reader.redrawLine()。然而,最后一个是阻塞,这让它变得很难(不是不可能,但使用第二个线程确实感觉不对)。

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

这有点像黑客,但我可以将文本预加载到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。

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

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

在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()

JLine3:的更新

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

readLine(String prompt, Character mask, String buffer)

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

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

不是为了劫持你的问题,但我不知道如何简单地打印一行来代替提示(表面上或视觉上用上面的消息向下推提示)。

最新更新