【问题标题】:Linux - moving the console cursor visualLinux - 移动控制台光标视觉
【发布时间】: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上实现移动光标视觉?

【问题讨论】:

标签: c++ linux qt command-line-interface termios


【解决方案1】:

Evilruff 在评论中提供了答案:

Cursor Movement

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[你

【讨论】:

  • 不鼓励仅链接的答案,因为链接可能会失效。如果您想宣传 evilruff 的评论作为答案,您应该包含链接中所需的所有内容以使其独立。
【解决方案2】:

不使用 ncurses 和 co 是一个严重的限制。

在 shell 上进行正确的输入/输出以显示任何内容都是地狱。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多