刷新前N行,并使用转义序列将光标重置到当前行的末尾?

时间:2018-12-14 03:28:15

标签: bash ansi-escape vt100

在这种情况下,我想进行一些终端交互,我想启动子线程来刷新前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
----------------

刷新代码效果很好,但是光标将重置为行的开始,我想始终将其移动到最后一行的末尾。 我该怎么做?

任何帮助将不胜感激。

3 个答案:

答案 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
  •   
     

来源:Bash Prompt HOWTO: Cursor movement

尽管这些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