首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用jline预填充行

用jline预填充行
EN

Stack Overflow用户
提问于 2012-09-05 01:24:16
回答 4查看 816关注 0票数 6

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

我试着去做,例如:

代码语言:javascript
复制
reader.getCursorBuffer().write("Default");
reader.readLine("Prompt> ");

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

我的理解是,我应该在调用readLine之后立即调用reader.redrawLine()。然而,最后一个是阻塞,这使得它变得很困难(并非不可能,但使用第二个线程来实现它肯定是错误的)。

EN

回答 4

Stack Overflow用户

发布于 2015-03-27 06:43:29

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

这是一个小技巧,但我能够将文本预加载到JLine缓冲区中,然后让用户通过执行以下操作来编辑它:

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2015-11-24 21:38:11

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

我从code found in JLine itself中获得灵感,它也使用线程来实现类似的目的。

在Scala中:

代码语言:javascript
复制
      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()
票数 1
EN

Stack Overflow用户

发布于 2013-05-18 02:37:07

如果你已经有了提示符设置,我想你应该选择resetPromptLine或者putStream

我不是想劫持你的问题,但我不知道如何简单地打印一行来代替提示符(表面上或视觉上将提示符按下并在其上方显示一条消息)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12268461

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档