换页不会清除屏幕

use*_*704 1 c escaping ada

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

阿达示例:

with Ada.Text_IO; use Ada.Text_IO;

procedure Main is
begin
  New_Page;
end Main;
Run Code Online (Sandbox Code Playgroud)

在C中相同:

#include <stdio.h>

int main (void) {
  printf ("\f");
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

两者都只导致XTerm以及Linux控制台(都使用zsh)的新行.他们应该清除屏幕而不是Ctrl-L.

当被召唤时

# ./main | cat -A
Run Code Online (Sandbox Code Playgroud)

我得到了

^L
Run Code Online (Sandbox Code Playgroud)

但如果我输入一个

# cat -A
Run Code Online (Sandbox Code Playgroud)

并键入a

Ctrl-L
Run Code Online (Sandbox Code Playgroud)

我得到了

^L
Run Code Online (Sandbox Code Playgroud)

太.

有谁知道如何使换页符作为Ctrl-L工作?

谢谢你的帮助!

Nob*_*lis 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中清除(在后一种情况下我得到一个空行).

  • 该转义序列适用于'ANSI'终端 - 符合ANSI标准转义序列的终端.很久以前,有许多替代的"绿屏"终端(有时候,"橙色屏幕"或其他颜色是合适的),每个终端都有自己特殊的转义序列.这导致了'curses`库的产生和第一个'termcap`,然后是`terminfo`作为描述变体行为的方法.然后每个人都进入终端模拟器而不是真正的绿屏终端,突然之间变得更加容易,ANSI控制代码占主导地位. (3认同)