Linux - 移动控制台光标可视化

use*_*186 4 c++ linux qt command-line-interface termios

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

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

/sf/answers/63895751/

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

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

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

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

    rewind(stdout);
}
Run Code Online (Sandbox Code Playgroud)

并用其他东西替换它,有效地模拟typeahead.例如,在退格的情况下,我会保存命令调用clear_line,并再次打印命令,只需少一个字母,行为与普通控制台应用程序完全相同.

我真正的问题是光标,在左/右箭头的情况下,我需要移动光标可视化,以便能够指示文本在用户寻找的位置:在此输入图像描述

由于我如何重写给定的stdout线以模拟typeahead的性质,光标REALLY的位置并不重要,只要它保持在同一条线上 - 它只是重要的视觉效果.如何在linux上实现移动光标可视化?

use*_*186 7

答案在Evilruff的评论中提供:

光标移动

ANSI转义序列允许您随意在屏幕上移动光标.这对于s​​hell脚本生成的全屏用户界面更有用,但也可以在提示中使用.运动转义序列如下:

  • 定位光标:\ 033 [; H或\ 033 [L; Cf将光标置于L行和C列.
  • 将光标向上移动N行:\ 033 [NA
  • 将光标向下移动N行:\ 033 [NB
  • 向前移动光标N列:\ 033 [NC
  • 向后移动光标N列:\ 033 [ND

  • 清除屏幕,移至(0,0):\ 033 [2J

  • 擦除到行尾:\ 033 [K.

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

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