如何使用termcap库在终端中设置接口

时间:2017-08-29 14:10:33

标签: c termcap

我需要使用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

2 个答案:

答案 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。它恰好位于termcapterminfo之间的一组重叠函数中。在ncurses中,完整的描述位于terminfo manual page

  • 一些终端(微软telnet曾经是一个很好的例子,虽然最近没有人测试......)没有正确处理控制序列。在前面的示例中,可能已使用
    :cl=\E[J\E[H

来证明这一点:终端没有清除整个屏幕,只剩下其余部分。要解决此问题,修改了终端描述以将光标首先移动