1

我最近发现了 Ada 编程语言,但问题也存在于 C 编程语言中。换页没有按预期工作。

艾达示例:

with Ada.Text_IO; use Ada.Text_IO;

procedure Main is
begin
  New_Page;
end Main;

在 C 中相同:

#include <stdio.h>

int main (void) {
  printf ("\f");
  return 0;
}

两者都只会在 XTerm 和 Linux 控制台(都带有 zsh)上产生一个新行。他们应该像 Ctrl-L 一样清除屏幕。

当与

# ./main | cat -A

我得到一个

^L

但是如果我输入一个

# cat -A

并输入

Ctrl-L

我得到一个

^L

也。

有谁知道如何使表单提要像 Ctrl-L 一样工作?

谢谢你的帮助!

4

2 回答 2

5

根据这篇文章,清除屏幕的正确方法是printf("\033[2J");(前提是您的终端支持 ANSI 转义序列并且兼容VT100 )。我可以确认这适用于使用 GNOME 终端的 Linux Mint,以及使用 xterm 和 PuTTY 的 Windows。

^L清除屏幕看起来不像是便携式约定。例如,在带有 POSIX shell 的 HP-UX 上,传递^L给 shell 不会做任何事情。这似乎更像是一个bash事件。

打印\f将清除某些终端的屏幕,但不会清除其他终端。例如,从 Windows 登录到 Red Hat 主机,我可以printf("\f");在 PuTTY 中但不能在 xterm 中清除屏幕(在后一种情况下我得到一个空行)。

于 2013-07-25T02:01:39.400 回答
2

我试图编辑@Nobilis 的答案以添加 Ada 版本,但我认为当屏幕被清除时我的编辑丢失了,所以这是另一个尝试:

with Ada.Text_IO; use Ada.Text_IO;

procedure Main is
begin
  Put (ASCII.ESC & "[2J");
end Main;

在较大的程序中,您可能需要在其后面加上“Flush;”。调用,因为上述内容可能会被 I/O 包缓冲,这可能不会意识到这是一个特殊的终端命令。(在 C 中也是如此,我认为:fflush(stdout);。)

于 2013-07-25T15:00:40.313 回答