我需要使用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);
}
这会清除屏幕,但它与命令本身$:> ./exec
保持一致。我不允许使用ncurses.h
库。
这是一个主要的:
int main(void)
{
clear_screen();
printf("Hello World!\n");
return (0);
}
printf("\033[2J"); // clear screen
printf("\033[H"); // cursor home
如果你想对屏幕做任何事情,这是一种方法。你可以从'一些程序员老兄的评论中查找其他代码。您还可以谷歌vt100代码。
有些图书馆像Ncurses那样抽象出来,但既然你不能使用它(为什么?)那就出来了 - 我会让其他人详细说明这一点,也许还有其他人可以允许......
试试这个:
printf("\033[1A\r\033[2K");
看我的评论。
VT100代码也无济于事
如果你想对屏幕做任何事情vt100代码就像一个黑客的梦想成真。跑,如果你看到DEA即将来临,他们就是那么好。
问题中省略了一些东西(它将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
为了证明这一点:终端没有清除整个屏幕,只剩下其余部分。为解决此问题,修改了终端描述以首先移动光标。