【问题标题】:Refresh first N lines and reset cursor to the end of current line with escape sequences?刷新前 N 行并使用转义序列将光标重置到当前行的末尾?
【发布时间】:2018-12-14 03:28:15
【问题描述】:

这样的情况,我想做一些终端交互,我想启动子线程刷新前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
----------------

刷新代码运行良好,但光标将重置到行首,我想始终将其移动到最后一行的末尾。 我该怎么做?

任何帮助将不胜感激。

【问题讨论】:

  • 这是什么编程语言?这不是 bash。请删除bash 标签并添加适当的标签。这将吸引能够更好地回答您问题的人的更多关注。
  • @AdamKatz 其实我认为同样的原则也适用于其他语言,我的代码只是一个例子。

标签: bash ansi-escape vt100


【解决方案1】:

当归结为移动光标时,您可能对简单的 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 的使用感兴趣,因为它为您提供了更多可读性的脚本。在这里解释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

【讨论】:

    【解决方案2】:

    您可以让孩子“知道”输入正在进行中,在这种情况下,请关注println!

    • 带有额外的向下光标(即\x1B[B)或下一行(\x1B[E),
    • 接着在该行中移动,使用提示的长度加上当前输入的长度,例如,光标向前(即,\x1B[C,在 @987654326 之前将列数作为参数@)。

    类似

    if (input_length) {
        cursor_down();
        cursor_forward(prompt_length + input_length);
    }
    

    【讨论】:

    • ?,让我试试。
    • 但是如果输入字符串是可变的,可能是多行,我可以将光标重置到最后一行的末尾吗? \033[s 保存光标位置呢?
    • 这取决于终端(见this)。
    【解决方案3】:

    虽然没有完全回答您的问题,但标准的 bash 方法是 watch

    例如:

    watch df -h

    【讨论】:

      猜你喜欢
      • 2013-05-12
      • 2012-01-12
      • 1970-01-01
      • 1970-01-01
      • 2014-09-22
      • 2011-07-05
      • 2012-11-10
      • 1970-01-01
      • 2011-01-24
      相关资源
      最近更新 更多