我目前正在为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
,并再次打印命令,只需少一个字母,行为与普通控制台应用程序完全相同。
我真正的问题在于光标,在左/右箭头的情况下,我需要将光标移动到视觉上,以便能够指示文本在用户寻找的位置:
由于我如何重写给定的stdout线以模拟typeahead的性质,光标REALLY的位置并不重要,只要它保持在同一条线上 - 它只是视觉上的重要部分。如何在linux上实现光标移动?
答案 0 :(得分:7)
答案在Evilruff的评论中提供:
ANSI转义序列允许您随意在屏幕上移动光标。这对于shell脚本生成的全屏用户界面更有用,但也可以在提示中使用。运动逃逸序列如下:
向后移动光标N列: \ 033 [ND
清除屏幕,移至(0,0): \ 033 [2J
删除到行尾: \ 033 [K
保存光标位置: \ 033 [S
答案 1 :(得分:1)
不使用ncurses和co是一个严重的限制。
在shell上进行正确的输入/输出以显示任何内容真是太棒了。
唯一的其他真正的解决方案(我不能认为是重新实现类似ncurse的库的解决方案)我想到的是: