C 表单馈送不清除屏幕

C 表单馈送不清除屏幕,c,escaping,ada,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; } 我得到一份工作 ^L 但是如果我打a # cat -A a型 Ctrl-L

我最近发现了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;
}
我得到一份工作

^L
但是如果我打a

# cat -A
a型

Ctrl-L
我得到一份工作

^L
也是

有人知道如何使表单提要作为Ctrl-L工作吗

谢谢你的帮助

根据正确的方式清除屏幕是
printf(“\033[2J”);
(前提是您的终端支持ANSI转义序列并且是-兼容的)。我可以确认这在使用GNOME终端的Linux Mint上有效,在使用xterm和PuTTY的Windows上有效

^L
清除屏幕看起来不像是一种可移植的约定。例如,在带有POSIX外壳的HP-UX上,将
^L
传递到外壳并不起任何作用。这更像是一种
bash
事件

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

根据正确的清除屏幕的方法是
printf(“\033[2J”);
(前提是您的终端支持ANSI转义序列并且是-兼容的)。我可以确认这在使用GNOME终端的Linux Mint和使用xterm和PuTTY的Windows上都有效

^L
清除屏幕看起来不像是一种可移植的约定。例如,在带有POSIX外壳的HP-UX上,将
^L
传递到外壳并不起任何作用。这更像是一种
bash
事件


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

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

with Ada.Text_IO; use Ada.Text_IO;

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

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

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

with Ada.Text_IO; use Ada.Text_IO;

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

在更大的程序中,您可能需要使用“Flush;”调用来跟踪它,因为上面的命令可能会被I/O包缓冲,而I/O包可能不会意识到这是一个特殊的终端命令。(在C中也是一样,我认为:
fflush(stdout);

从来没有听说过
Strg-L
。它与
ctrl
一样吗?它看起来像“Strg”(Steuerung)是德语中“Ctrl”的意思(在键盘上)@user2616704我不知道你为什么希望输出ctrl-L字符来清除屏幕。可能有一些操作系统或终端模拟器或其他软件可以这样做,但这不是标准的。在任何情况下,Ada或C都不是语言问题。术语
“\f”
是“表单提要”和w的助记符最初设计用于清除屏幕(或者更正式地说,用于转到打印机下一页的顶部)。期望Control-L清除屏幕并非毫无道理。然而,我也可以相信,现代终端仿真并不能做到这一点。如果你能找到
termcap
文件,你会发现许多终端类型都有
:cl=^L:
作为“清除屏幕”命令,尽管我的副本中没有一个是主要的制造商ers(Wyse、DEC等)。从未听说过
Strg-L
。它与
ctrl-L
相同吗?它看起来像是“Strg”(Steuerung)在德语中表示“ctrl”(在键盘上)@user2616704我不知道你为什么希望输出ctrl-L字符来清除屏幕。可能有一些操作系统或终端模拟器或其他软件可以这样做,但这不是标准的。在任何情况下,Ada或C都不是语言问题。术语
“\f”
是“表单提要”和w的助记符最初设计用于清除屏幕(或者更正式地说,用于转到打印机下一页的顶部)。期望Control-L清除屏幕并非毫无道理。然而,我也可以相信,现代终端仿真并不能做到这一点。如果你能找到
termcap
文件,你会发现许多终端类型都有
:cl=^L:
作为“清除屏幕”命令,尽管我的副本中没有一个是主要的制造商ers(Wyse、DEC等)。它不是外壳本身,而是终端模拟器(或驱动程序,如果您在控制台屏幕上)。该转义序列适用于“ANSI”终端,即遵循ANSI标准转义序列的终端。很久以前,有许多替代的“绿屏”终端(有时,“橙色屏幕”或其他颜色是合适的),每个人都有自己独特的转义序列。这导致了
诅咒
库的产生,首先
termcap
,然后
termfo
作为描述变异行为的方法。然后每个人都进入终端模拟器而不是真正的绿屏终端,突然之间,一切变得更加简单和简单ANSI控制代码占主导地位。是的,但简单地假设您使用的是vt100兼容的终端,并且打印
“\033[2J”
仍然是不正确的。我经常使用控制台不兼容vt100的系统,在该屏幕上,我会看到实际的
[2J
显示的字符。@ElchononEdelson:您始终可以运行GNU screen或tmux来“修复”这样的终端。-)是的……不。我不这么认为。为什么不直接正确编写程序呢?如果您真的需要清除屏幕,请使用terminfo。它不是外壳本身,而是终端仿真器(或驱动程序)