【发布时间】:2015-04-12 23:05:16
【问题描述】:
目前我正在执行此操作,如何修复在终端底部以反向视频打印的消息的位置
printf("\033[7m more?\033[m");
【问题讨论】:
-
你知道终端的高度吗?它是物理终端还是虚拟终端?你现在拥有的有什么问题?描述你看到的行为,你想保留哪些部分,以及你想改变什么。
-
是的,我知道终端的高度
目前我正在执行此操作,如何修复在终端底部以反向视频打印的消息的位置
printf("\033[7m more?\033[m");
【问题讨论】:
下面的ANSI escape sequences可以用来完成打印最下面一行的文字:
如果您知道屏幕上的行数,则可以改用绝对水平和垂直位置命令。 (使用 Windows 转义序列仿真 ANSI.SYS,您可能无法访问 Cursor Next Line Down 或 Cursor Absolute Horizontal 移动命令)
最终代码可能如下所示:
fputs("\033[s\033[99E\033[2K\033[7m more?\033[m\033[u", stdout);
【讨论】:
hpa 或vpa(此解决方案的可移植性问题),而标签显示“linux”(Linux 控制台可以)。给定标签,ANSI.SYS 可能很有趣但不相关。
常数不会告诉读者太多。 C语句
printf("\033[7m more?\033[m");
可以使用 termcap 接口完成,例如,从 ncurses 通过检索 mode reverse 或 "mr" 功能("\033[7m" 子字符串)和 mode default "md"("\033[m" 子字符串)。事实上,寻呼机“more”和“less”就是这样写的。
如果您使用的是 termcap,那么您可以使用 tgetstr 检索 光标移动 "cm" 功能,然后使用 tgoto 和 tputs 将光标发送到屏幕。
"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;
}
【讨论】: