我正在使用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前缀显示时间一直到某个东西到期为止。我有一个单独的线程,通过执行(int其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
有没有一种方法可以编辑外壳程序前缀,然后返回到用户之前键入的相同光标位置,以便他们可以无缝恢复?
最佳答案
假设输入来自常规输入(例如,无诅咒,无读线等),则以下转义序列可用于VT100兼容终端(包括大多数xterm,vt102和其他终端仿真器)。 ESC是转义符(\033
)
保存光标ESC 7
恢复Curosr'ESC 8'
println应该类似于:
System.out.print("\0337\r" + displayTime + "> \0338");
您还必须确保未缓冲System.out。
关于java - 用户键入时编辑 shell 程序前缀,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/59118478/