我需要使用C中的interface
在终端中创建termios.h
。为了保持简短,我必须创建一个像./exec
这样的可执行文件,在我运行之后,它必须停止显示PS1
变量。
如果我有一个程序显示使用Hello World
的以下文字printf
,它将如下所示:
$:> ./exec
Hello World!
但是,不是打印它,我只需要Hello World!
在终端中,就像在程序显示时清除屏幕一样。
Hello World!
以其他方式说出来,目的是清理终端,当./exec
运行时,它也应该清除此行,$:> ./exec
。
到目前为止,我设法完成了这项功能
void clear_screen()
{
char buf[1024];
char *str;
tgetent(buf, getenv("TERM"));
str = tgetstr("cl", NULL);
fputs(str, stdout);
}
清除屏幕但它与命令本身[{1}}保持一致。我不被允许使用$:> ./exec
库。
这是一个主要的:
ncurses.h
答案 0 :(得分:1)
printf("\033[2J"); // clear screen
printf("\033[H"); // cursor home
如果你想对屏幕做任何事情,这是一种方法。你可以从一些程序员老兄的评论中查找其他代码。您还可以谷歌vt100代码。
有些图书馆会像Ncurses那样抽象出来,但既然你不能使用它(为什么?)那就出来了 - 我会让其他人详细说明这一点,也许还有其他的< em> 允许..
试试这个:
printf("\033[1A\r\033[2K");
请参阅我的评论。
VT100代码无法帮助
如果您想对屏幕做任何事情vt100代码就像黑客的梦想成真。跑,如果你看到DEA即将来临,他们就是那么好。
答案 1 :(得分:0)
问题中省略了一些东西(并且它将termcap与termios混淆)。由于示例代码使用了termcap,因此答案应该解决这个问题。回顾一下,这是一个完整的例子:
#include <stdio.h>
#include <stdlib.h>
#include <termcap.h> /* this comes from ncurses, anyway... */
static void clear_screen(void)
{
char buf[1024];
char *str;
tgetent(buf, getenv("TERM"));
str = tgetstr("cl", NULL);
fputs(str, stdout);
}
int main(void)
{
clear_screen();
printf("Hello World!\n");
return (0);
}
"cl"
功能才是最重要的。它被定义为terminfo clear
的相应特征:
clear_screen clear cl clear screen and
home cursor (P*)
如果您使用正确编写的终端描述从命令行运行该示例,则输出执行此操作:
之后,shell再次打印它的提示。
这个例子有几个问题:
fputs
进行输出。 terminfo / termcap数据可能包含填充,这将无法使用。您不会注意到常见的终端仿真器的终端描述,但它对硬件终端很重要。例如, vt100 termcap会有这个(“50”是填充)::cl=50\E[H\E[J:
使用的正确功能是tputs
。它恰好位于termcap和terminfo之间的一组重叠函数中。在ncurses中,完整的描述位于terminfo manual page。
:cl=\E[J\E[H
来证明这一点:终端没有清除整个屏幕,只剩下其余部分。要解决此问题,修改了终端描述以将光标首先移动。