Linux - 移动控制台光标视觉

Linux - moving the console cursor visual

我目前正在为 linux 设计 CLI 界面,由于各种原因 我无法使用 ncurses。我只使用 C++ 和 Qt 框架。

因此,为了有一个用户友好的界面,我必须运行这个getch循环在一个单独的线程中:

这基本上意味着我必须自己实现所有基本功能(例如退格键)。我已经实现了命令完成和命令历史记录(比如当你在 linux 中按 tab 或 uparrow/downarrow 时),但我无法弄清楚如何实现 leftarrow/rightarrow (也就是通过 typeahead 寻找).

通常,我是这样实现的:在每个不等于 -1 的 gech 上,我检查用户是否按下了一个特殊键(以某种方式修改 typeahead 的键)。然后我使用以下函数清除标准输出:

void inputobject::clear_line(int nletters)
{
    QTextStream(stdout) << "3[2K";

    for(int i = 0; i < nletters;i++){
        QTextStream(stdout) << "\b";
    }

    rewind(stdout);
}

并用其他东西替换它,有效地模拟提前输入。例如,在退格的情况下,我会保存命令调用 clear_line,然后再次打印命令,只是少了一个字母,其行为与普通控制台应用程序完全一样。

我真正的问题是光标,在 left/rightarrow 的情况下,我需要移动光标视觉以便能够指示用户在文本中查找的位置:

由于我重写给定 stdout 行以模拟提前输入的方式的性质,光标真正位于何处并不重要,只要它保持在同一行上 - 重要的只是视觉效果.如何实现在 linux 上移动光标视觉效果?

不使用 ncurses 和 co 是一个严重的限制。

在 shell 上做出正确的 input/output 来显示任何东西真是地狱。

我想到的唯一其他真正的解决方案(我不能认为这是重新实现类似 ncurse 的库的解决方案)是:

Evilruff 的评论中提供了答案:

Cursor Movement

ANSI 转义序列允许您随意在屏幕上移动光标。这对于由 shell 脚本生成的全屏用户界面更有用,但也可用于提示。移动转义序列如下:

  • 定位光标: \033[;H 要么 \033[L;Cf 将光标置于 L 行和 C 列。
  • 光标向上移动N行: \033[不适用
  • 将光标向下移动N行: \033[注意
  • 将光标向前移动N列: \033[NC
  • 将光标向后移动N列: \033[ND

  • 清屏,移动到(0,0): \033[2J

  • 擦除到行尾: \033[K

  • 保存光标位置: \033[s

  • 恢复光标位置: \033[你