我目前正在为linux设计一个CLI接口,由于各种原因,我无法使用ncures。我只使用C++和Qt框架。
因此,为了具有一个用户友好的界面,我必须在一个单独的线程中运行这个getch循环:
https://stackoverflow.com/a/912796/3605689
这基本上意味着我必须自己实现所有的基本功能(比如后台空间)。我已经实现了命令完成和命令历史记录(就像在linux中按tab键或uparrow/ when箭头时),但是我不知道如何实现左尾/右箭头(也就是通过typeahead查找)。
通常,我是这样实现的:在每个不等于-1的gech上,我检查用户是否按了一个特殊的键(一个以某种方式修改了打字机的键)。然后使用以下函数清除stdout:
void inputobject::clear_line(int nletters)
{
QTextStream(stdout) << "\033[2K";
for(int i = 0; i < nletters;i++){
QTextStream(stdout) << "\b";
}
rewind(stdout);
}
代之以其他的东西,有效地模拟预先输入。例如,在backspace的情况下,我将保存命令调用clear_line
,然后再次输出命令,只需少写一个字母,就像正常的控制台应用程序那样。
我真正的问题是光标,在左/右的情况下,我需要将光标移动到可视的位置,以便能够指示文本中的用户正在寻找的位置:
由于我是如何重写给定的stdout行来模拟打字机的,所以只要光标停留在同一条线上,光标在哪里并不重要--重要的是视觉上的问题。如何在linux上实现移动光标的可视化?
发布于 2016-08-08 10:58:30
在Evilruff的评论中提供了答案:
光标运动
ANSI转义序列允许您随意在屏幕周围移动光标。这对于shell脚本生成的全屏用户界面更有用,但也可以在提示中使用。运动转义序列如下:
发布于 2016-08-04 15:33:31
不使用ncurses和co是一个严重的限制。
在shell上进行正确的输入/输出以显示任何内容是非常困难的。
我想到的唯一其他真正的解决方案(我不能认为是重新实现一个类似于ncurse的库的解决方案)是:
https://stackoverflow.com/questions/38770996
复制相似问题