【问题标题】:Java: "History" for cli commands, how to make ouput "editable"?Java:cli命令的“历史”,如何使输出“可编辑”?
【发布时间】:2010-12-15 11:29:12
【问题描述】:

我想在我的 java 程序中添加一个“历史”功能,就像从 bash 等中知道的那样,所以按箭头键应该会显示以前的发送命令。

将过去的命令写入默认输出是没有问题的,如果按三下箭头,默认输出将在三个新行中,并且在不可编辑的输出中。我希望将程序的输出写入输入字段,因此我只需按 Enter 键即可重新发送命令。

这可能吗?

亲切的问候

【问题讨论】:

  • 有些库可以做这种事情并像 bash 一样处理自动完成和选项列表。 Apache Felix 使用了一个(我认为他们改变了使用哪一个)

标签: java command-line


【解决方案1】:

看看JLine,它提供了命令历史记录、制表符补全和行编辑。

【讨论】:

  • +1 用于 JLine。我也成功地将 JLine 集成到我的项目中,并且我总是更喜欢使用它而不是我自己的本土解决方案......
  • 感谢您的建议,但我更喜欢自己做。如果我失败了,会仔细看看;)
【解决方案2】:

如果您想推出自己的解决方案,这将帮助您入门。

您想从使用缓冲输入更改为直接输入。您可以通过直接与System.in 交互来做到这一点。您应该创建一个线程来处理这个问题,并让它在循环中阻止对System.in.read() 的调用,一次读取一个字节。

每次读取一个字节时,使用正在读取的当前命令更新您自己的缓冲区。每个输入的字符,都将其添加到缓冲区中。如果字符是\b,则删除缓冲区中的最后一个字符。当检测到\r\n时,执行缓冲区中的命令并将其清除。

如果您收到向上或向下箭头,请将数量等于缓冲区长度的\bs 发送到System.out。这将擦除当前输入的任何命令的本地副本。然后将新命令打印到System.out 并将其输入缓冲区,替换那里的任何内容。这将允许用户删除它、添加它,或者只需按 Enter 键提交它。这模仿了 bash 的功能。

您还可以检测\t(制表符)字符并实现制表符补全功能。

【讨论】:

  • 我正在寻找第三块 :)
  • 哎呀,将评论发送到早期...发送 \b 到客户端(当前在 XP 下的 telnet,如果重要的话)会使光标返回一个字符,但不会删除该字符。用“222”覆盖“111”以“222”结束,但用“222”覆盖“11111”以“22211”结束。
  • 然后自己清空,先输出空格再输出更多\b。
  • 似乎System.in.read() 被缓冲了,直到按下Return/Enter 后我才从中获取任何字节,这将返回所有输入的字符。
猜你喜欢
  • 2016-05-26
  • 2013-08-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-11
  • 1970-01-01
  • 2018-07-29
  • 2016-08-24
相关资源
最近更新 更多