Linux - 移动控制台光标视觉

时间:2016-08-04 15:03:24

标签: c++ linux qt command-line-interface termios

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

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

https://stackoverflow.com/a/912796/3605689

这基本上意味着我必须自己实现所有基本功能(例如退格)。我已经实现了命令完成和命令历史记录(比如当你在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);
}

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

我真正的问题在于光标,在左/右箭头的情况下,我需要将光标移动到视觉上,以便能够指示文本在用户寻找的位置:enter image description here

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

2 个答案:

答案 0 :(得分:7)

答案在Evilruff的评论中提供:

Cursor Movement

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

  • 定位光标: \ 033 [; H  要么 \ 033 [L;比照 将光标放在第L行和第C列。
  • 将光标向上移动N行: \ 033 [NA
  • 将光标向下移动N行: \ 033 [NB
  • 将光标向前移动N列: \ 033 [NC
  • 向后移动光标N列: \ 033 [ND

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

  • 删除到行尾: \ 033 [K

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

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

答案 1 :(得分:1)

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

在shell上进行正确的输入/输出以显示任何内容真是太棒了。

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