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

11

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

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

https://dev59.com/MnRC5IYBdhLWcg3wD83r#912796

这基本上意味着我必须自己实现所有基本功能(例如退格),我已经实现了命令完成和命令历史记录(就像在Linux中按tab或uparrow / downarrow时) ,但我无法弄清楚如何实现左箭头/右箭头(即在输入时查找)。

通常,我会这样实现:每次不等于-1的getch时,我都会检查用户是否按下了特殊键(修改输入的某个键)。然后,我使用以下函数清除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行以模拟类型提示的方式的性质,真正的光标位置并不重要,只要它停留在同一行上 - 只有视觉效果才重要。如何在Linux上实现移动光标视觉效果?


你考虑过查看ncurses源代码来看它是如何实现的吗? - Jesper Juhl
1
http://www.tldp.org/HOWTO/Bash-Prompt-HOWTO/x361.html 不就是你在找的吗? - evilruff
2个回答

21

Evilruff在评论中提供了答案:

光标移动

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

  • 定位光标: \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

1
链接式答案不被鼓励,因为链接可能会失效。如果您想将evilruff的评论作为答案推广,您应该包含链接中所需的所有内容,使其自成一体。 - Quentin

1

不使用ncurses等库是一个严重的限制。

在shell上显示任何内容都很麻烦。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接