【问题标题】:Message in reverse video反向视频消息
【发布时间】:2015-04-12 23:05:16
【问题描述】:

目前我正在执行此操作,如何修复在终端底部以反向视频打印的消息的位置

printf("\033[7m more?\033[m");

【问题讨论】:

  • 你知道终端的高度吗?它是物理终端还是虚拟终端?你现在拥有的有什么问题?描述你看到的行为,你想保留哪些部分,以及你想改变什么。
  • 是的,我知道终端的高度

标签: c linux terminal


【解决方案1】:

下面的ANSI escape sequences可以用来完成打印最下面一行的文字:

  • 保存光标位置
  • 光标下一行
  • 恢复光标位置

如果您知道屏幕上的行数,则可以改用绝对水平和垂直位置命令。 (使用 Windows 转义序列仿真 ANSI.SYS,您可能无法访问 Cursor Next Line Down 或 Cursor Absolute Horizo​​ntal 移动命令)

最终代码可能如下所示:

fputs("\033[s\033[99E\033[2K\033[7m more?\033[m\033[u", stdout);

【讨论】:

  • 另一方面,VT100 无法识别hpavpa(此解决方案的可移植性问题),而标签显示“linux”(Linux 控制台可以)。给定标签,ANSI.SYS 可能很有趣但不相关。
  • 每次新行打印更多时,我想打印更多的文本? some_text 更多?等等....
  • @TamoorAshiqChheena:如果你写完整的句子会更容易理解。
  • @BenVoigt 对此感到抱歉。
【解决方案2】:

常数不会告诉读者太多。 C语句

printf("\033[7m more?\033[m");

可以使用 termcap 接口完成,例如,从 ncurses 通过检索 mode reverse"mr" 功能("\033[7m" 子字符串)和 mode default "md""\033[m" 子字符串)。事实上,寻呼机“more”和“less”就是这样写的。

如果您使用的是 termcap,那么您可以使用 tgetstr 检索 光标移动 "cm" 功能,然后使用 tgototputs 将光标发送到屏幕。

"cm" 类似于"\E[%i%d;%dH",表示从零开始的坐标递增,然后转换为十进制。基于 VT100 的终端从 1(一)开始计算行/列。其他终端可能不行。

作为参考,ncurses 的 termcap manual page 列出了这些调用,而 terminfo format 手册页列出了 termcap 助记符。 terminfo 实际上是首选(请参阅manual page)。

termcap 界面缺少的一个功能是如何获取屏幕上最后一行的位置。 OP 没有给出使用 printf 的上下文。它可能是不需要清除屏幕的应用程序。在这种情况下,可以使用ioctl(0, TIOCGWINSZ, &ws);(参见How to get terminal window width?)来获取屏幕尺寸,并在tgoto 调用中使用得到的高度作为参数。使用硬编码转义序列“越过”屏幕底部的替代方案不太灵活,因为它们的可用性因终端类型而异。

如果清除屏幕是可以接受的,那么使用 curses 比 termcap 更简单。这是一个简短的例子:

#include <curses.h>

int main(void)
{
    initscr(); cbreak(); noecho();
    attron(A_REVERSE);
    mvprintw(LINES - 1, 0, " more?");
    getch();
    endwin();
    return 0;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-02-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-08
    • 1970-01-01
    • 2021-03-24
    相关资源
    最近更新 更多