用户输入时编辑外壳程序前缀

时间:2019-11-30 17:17:01

标签: java shell

我正在使用BufferedReader从终端读取行:

BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
String cmd;
String displayTime;

while(true)
{
     System.out.print(displayTime +  "> ");

     cmd = in.readLine();

     // Process cmd
}

目标是使Shell前缀显示时间一直到某个东西到期为止。我有一个单独的线程,通过执行(诠释其run()方法)来每秒更新字符串displayTime,例如“ 5:00”,“ 4:49”……。

while(true)
{
     Thread.sleep(1000);
     decrement(displayTime);
     System.out.print("\r" + displayTime +  "> ");
}

回车符“ \ r” ar达到了打印语句的开头,但是当用户键入时,当回车符中断它们时,它们的光标将重置为开头,并且他们将开始替换字符他们之前已经输入过(尽管BufferedReader仍然包含正确的命令,但从视觉上看这是错误的)。

例如,键入“ listfiles”的结果:

l
li
lis
list
fist   <-- carriage return happens here
fist
filt
file
files

有没有一种方法可以编辑外壳程序前缀,然后返回到用户之前键入的光标位置,以便他们可以无缝恢复?

1 个答案:

答案 0 :(得分:1)

假定输入来自常规输入(例如,无诅咒,readline等),则以下转义序列可用于VT100兼容终端(包括大多数xterm,vt102和其他终端仿真器)。 ESC是转义符(\033

  • 保存光标ESC 7
  • 还原Curosr'ESC 8'

println应该类似于:

     System.out.print("\0337\r" + displayTime +  "> \0338");

您还必须确保未缓冲System.out。