换页不会清除屏幕

时间:2013-07-25 00:59:14

标签: c escaping ada

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

Ada示例:

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工作?

感谢您的帮助!

2 个答案:

答案 0 :(得分:5)

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

清除屏幕的

^L看起来不像便携式约定。例如,在带有POSIX shell的HP-UX上,将^L传递给shell不会执行任何操作。这看起来更像bash次。

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

答案 1 :(得分: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);。)