【发布时间】:2016-12-10 19:01:27
【问题描述】:
我目前正在为 linux 设计一个 CLI 界面,由于各种原因我无法使用 ncurses。我只使用 C++ 和 Qt 框架。
因此,为了有一个用户友好的界面,我必须在一个单独的线程中运行这个 getch 循环:
https://stackoverflow.com/a/912796/3605689
这基本上意味着我必须自己实现所有基本功能(例如退格)。我已经实现了命令完成和命令历史记录(比如当你在 linux 中按 tab 或 uparrow/downarrow 时),但我不知道如何实现 leftarrow/rightarrow(也就是通过 typeahead 搜索)。
通常,我是这样实现的:在每个不等于 -1 的 gech 上,我检查用户是否按下了特殊键(以某种方式修改预输入的键)。然后我使用以下函数清除标准输出:
void inputobject::clear_line(int nletters)
{
QTextStream(stdout) << "\033[2K";
for(int i = 0; i < nletters;i++){
QTextStream(stdout) << "\b";
}
rewind(stdout);
}
然后用其他东西替换它,有效地模拟预输入。例如,在退格的情况下,我会保存命令调用clear_line,然后再次打印命令,只需少一个字母,其行为与普通控制台应用程序完全相同。
我真正的问题是光标,在左/右箭头的情况下,我需要移动光标视觉以便能够指示用户在文本中寻找的位置:
由于我重写给定标准输出行以模拟预输入的性质,只要光标保持在同一行上,光标的真正位置并不重要——重要的是视觉效果。如何在linux上实现移动光标视觉?
【问题讨论】:
-
您是否考虑过查看
ncurses源代码以了解它是如何做到的?
标签: c++ linux qt command-line-interface termios