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

问题描述 投票:0回答:2

我需要使用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);
}
c termcap
2个回答
1
投票
printf("\033[2J"); // clear screen
printf("\033[H"); // cursor home

如果你想对屏幕做任何事情,这是一种方法。你可以从'一些程序员老兄的评论中查找其他代码。您还可以谷歌vt100代码。

有些图书馆像Ncurses那样抽象出来,但既然你不能使用它(为什么?)那就出来了 - 我会让其他人详细说明这一点,也许还有其他人可以允许......

edit

试试这个:

printf("\033[1A\r\033[2K");

看我的评论。

VT100代码也无济于事

如果你想对屏幕做任何事情vt100代码就像一个黑客的梦想成真。跑,如果你看到DEA即将来临,他们就是那么好。


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

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

© www.soinside.com 2019 - 2024. All rights reserved.