Linux - 移动控制台光标视觉
Linux - moving the console cursor visual
我目前正在为 linux 设计 CLI 界面,由于各种原因 我无法使用 ncurses。我只使用 C++ 和 Qt 框架。
因此,为了有一个用户友好的界面,我必须运行这个getch循环在一个单独的线程中:
这基本上意味着我必须自己实现所有基本功能(例如退格键)。我已经实现了命令完成和命令历史记录(比如当你在 linux 中按 tab 或 uparrow/downarrow 时),但我无法弄清楚如何实现 leftarrow/rightarrow (也就是通过 typeahead 寻找).
通常,我是这样实现的:在每个不等于 -1 的 gech 上,我检查用户是否按下了一个特殊键(以某种方式修改 typeahead 的键)。然后我使用以下函数清除标准输出:
void inputobject::clear_line(int nletters)
{
QTextStream(stdout) << "3[2K";
for(int i = 0; i < nletters;i++){
QTextStream(stdout) << "\b";
}
rewind(stdout);
}
并用其他东西替换它,有效地模拟提前输入。例如,在退格的情况下,我会保存命令调用 clear_line
,然后再次打印命令,只是少了一个字母,其行为与普通控制台应用程序完全一样。
我真正的问题是光标,在 left/rightarrow 的情况下,我需要移动光标视觉以便能够指示用户在文本中查找的位置:
由于我重写给定 stdout 行以模拟提前输入的方式的性质,光标真正位于何处并不重要,只要它保持在同一行上 - 重要的只是视觉效果.如何实现在 linux 上移动光标视觉效果?
不使用 ncurses 和 co 是一个严重的限制。
在 shell 上做出正确的 input/output 来显示任何东西真是地狱。
我想到的唯一其他真正的解决方案(我不能认为这是重新实现类似 ncurse 的库的解决方案)是:
- 调用对话框(例如 www.linuxjournal.com/article/2807 和文档:http://linux.die.net/man/1/dialog)
- 在 Qt4 中使用帧缓冲机制 (here)
Evilruff 的评论中提供了答案:
ANSI 转义序列允许您随意在屏幕上移动光标。这对于由 shell 脚本生成的全屏用户界面更有用,但也可用于提示。移动转义序列如下:
- 定位光标:
\033[;H
要么
\033[L;Cf
将光标置于 L 行和 C 列。
- 光标向上移动N行:
\033[不适用
- 将光标向下移动N行:
\033[注意
- 将光标向前移动N列:
\033[NC
将光标向后移动N列:
\033[ND
清屏,移动到(0,0):
\033[2J
擦除到行尾:
\033[K
保存光标位置:
\033[s
- 恢复光标位置:
\033[你
我目前正在为 linux 设计 CLI 界面,由于各种原因 我无法使用 ncurses。我只使用 C++ 和 Qt 框架。
因此,为了有一个用户友好的界面,我必须运行这个getch循环在一个单独的线程中:
这基本上意味着我必须自己实现所有基本功能(例如退格键)。我已经实现了命令完成和命令历史记录(比如当你在 linux 中按 tab 或 uparrow/downarrow 时),但我无法弄清楚如何实现 leftarrow/rightarrow (也就是通过 typeahead 寻找).
通常,我是这样实现的:在每个不等于 -1 的 gech 上,我检查用户是否按下了一个特殊键(以某种方式修改 typeahead 的键)。然后我使用以下函数清除标准输出:
void inputobject::clear_line(int nletters)
{
QTextStream(stdout) << "3[2K";
for(int i = 0; i < nletters;i++){
QTextStream(stdout) << "\b";
}
rewind(stdout);
}
并用其他东西替换它,有效地模拟提前输入。例如,在退格的情况下,我会保存命令调用 clear_line
,然后再次打印命令,只是少了一个字母,其行为与普通控制台应用程序完全一样。
我真正的问题是光标,在 left/rightarrow 的情况下,我需要移动光标视觉以便能够指示用户在文本中查找的位置:
由于我重写给定 stdout 行以模拟提前输入的方式的性质,光标真正位于何处并不重要,只要它保持在同一行上 - 重要的只是视觉效果.如何实现在 linux 上移动光标视觉效果?
不使用 ncurses 和 co 是一个严重的限制。
在 shell 上做出正确的 input/output 来显示任何东西真是地狱。
我想到的唯一其他真正的解决方案(我不能认为这是重新实现类似 ncurse 的库的解决方案)是:
- 调用对话框(例如 www.linuxjournal.com/article/2807 和文档:http://linux.die.net/man/1/dialog)
- 在 Qt4 中使用帧缓冲机制 (here)
Evilruff 的评论中提供了答案:
ANSI 转义序列允许您随意在屏幕上移动光标。这对于由 shell 脚本生成的全屏用户界面更有用,但也可用于提示。移动转义序列如下:
- 定位光标: \033[;H 要么 \033[L;Cf 将光标置于 L 行和 C 列。
- 光标向上移动N行: \033[不适用
- 将光标向下移动N行: \033[注意
- 将光标向前移动N列: \033[NC
将光标向后移动N列: \033[ND
清屏,移动到(0,0): \033[2J
擦除到行尾: \033[K
保存光标位置: \033[s
- 恢复光标位置: \033[你