McG*_*ady 5 bash vt100 ansi-escape
这里的情况,我想做出一些终端的互动,我想启动子线程刷新第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);
}
Run Code Online (Sandbox Code Playgroud)
例如:
----------------
Hi user1, count: 0
Input: 1+1
Output: 2
----------------
Run Code Online (Sandbox Code Playgroud)
刷新代码运行良好,但光标将重置为行的开头,我想将它始终移动到最后一行的末尾.我怎么能这样做?
任何帮助将非常感谢.
当归结为移动光标时,您可能对简单的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因为它使您的脚本更具可读性。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 tputman 5 terminfo您可以让孩子“知道”输入正在进行中,在这种情况下,请按照println!
\x1B[B)或下一行(\x1B[E),\x1B[C将列数作为 之前的参数C)。就像是
if (input_length) {
cursor_down();
cursor_forward(prompt_length + input_length);
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
248 次 |
| 最近记录: |