在这种情况下,我想进行一些终端交互,我想启动子线程来刷新前N行,并使用主线程来处理用户输入。
此后,程序将打印可变字符串,也许会显示一些日志。
子线程是这样的:
let mut count: i32 = 0;
loop {
println!("\x1B[2F\x1B[2KHi user1, count:{}\n", count);
count += 1;
let ten_millis = time::Duration::from_millis(1000);
thread::sleep(ten_millis);
}
例如:
----------------
Hi user1, count: 0
Input: 1+1
Output: 2
----------------
刷新代码效果很好,但是光标将重置为行的开始,我想始终将其移动到最后一行的末尾。 我该怎么做?
任何帮助将不胜感激。
答案 0 :(得分:3)
当归结为移动光标时,您可能对简单的 ANSI转义序列感兴趣:
ANSI转义序列允许您随意在屏幕上移动光标。这对于由Shell脚本生成的全屏用户界面更有用,但也可以在提示中使用。运动逃逸顺序如下:
- 定位光标:
\033[<L>;<C>H
或\033[<L>;<C>f
将光标置于L行和C列。- 将光标向上移动N行:
\033[<N>A
- 将光标向下移动N行:
\033[<N>B
- 将光标向前移动N列:
\033[<N>C
- 将光标向后移N列:
\033[<N>D
- 清除屏幕,移至(0,0):
\033[2J
- 删除到行尾:
\033[K
- 保存光标位置:
\033[s
- 还原光标位置:
\033[u
尽管这些ANSI转义序列工作得非常好,但是您可能会不时对tput
的使用感兴趣,因为它为您提供了更多的 readablilty 脚本。在这里解释tput
可能会有些过分,但是上述命令可以通过以下方式完成:
- 定位光标:
tput cup <L> <C>
将光标置于L行和C列。- 将光标向上移动N行:
tput cuu <N>
- 将光标向下移动N行:
tput cud <N>
- 将光标向前移动N列:
tput cuf <N>
- 将光标向后移N列:
tput cub <N>
- 清除屏幕,移至(0,0):
tput clear
- 删除到行尾:
tput el
- 保存光标位置:
tput sc
- 还原光标位置:
tput rc
还有许多其他许多可用选项。见
man tput
man 5 terminfo
答案 1 :(得分:0)
您可以让孩子“知道”输入正在进行中,在这种情况下,请遵循println!
\x1B[B
)或下一行(\x1B[E
),\x1B[C
,其中以列数为之前的参数C
)。类似
if (input_length) {
cursor_down();
cursor_forward(prompt_length + input_length);
}
答案 2 :(得分:0)
虽然还不能完全回答您的问题,但标准的 bash 方法是watch
例如:
watch df -h