2013-07-25 20 views
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?

感謝您的幫助!

+0

從未聽說過'Strg-L'。它和'ctrl-L'一樣嗎? –

+1

它看起來像「Strg」(Steuerung)是「Ctrl」(在鍵盤上)的德語。 – ajb

+0

@ user2616704我不知道你爲什麼期望輸出ctrl-L字符來清除屏幕。也許有一些操作系統或一些終端仿真器或其他軟件可以這樣做,但這不是標準。在任何情況下,它都不是Ada或C的語言問題。 – ajb

回答

5

根據this article清除屏幕的正確方法是printf("\033[2J");(前提是您的終端支持ANSI轉義序列並且與VT100兼容)。我可以確認這可以在Linux Mint上使用GNOME Terminal,並在Windows上使用xterm和PuTTY。

^L清除屏幕看起來不像一個可移植的約定。例如,在帶有POSIX shell的HP-UX上,將^L傳遞給shell不會執行任何操作。這看起來更像是一個bash事件。

打印\f將清除屏幕上的一些終端,但不是其他人。例如,從Windows登錄到Red Hat主機,我可以在PuTTY中清除屏幕printf("\f");,但不能在xterm中顯示(在後一種情況下,我得到一個空行)。

+1

它不會是shell *本身*,而是終端模擬器(或者如果您在控制檯屏幕上的其中一個驅動程序)。 –

+3

該轉義序列適用於'ANSI'終端 - 符合ANSI標準轉義序列的終端。很久以前,有很多可選的'綠色屏幕'終端(有時,'橙色屏幕'或另一種顏色是合適的),每個終端都有自己特有的轉義序列集。這導致產生'curses'庫和第一個'termcap',然後'terminfo'作爲描述變體行爲的方式。然後,每個人都進入終端仿真器,而不是真正的綠色屏幕終端,並且突然之間變得更加容易,並且ANSI控制代碼占主導地位。 –

+1

是的,但只是假設你正在使用兼容vt100的終端並且打印'「\ 033 [2J」'仍然不正確。我經常使用一個與VT100不兼容的控制檯系統,在那個屏幕上,我會看到顯示的[2J]字符。 –

2

我嘗試編輯@Nobilis'答案補充一個阿達版本,但我認爲,當屏幕被清除了我的編輯迷路了,所以這裏的另一個嘗試:

with Ada.Text_IO; use Ada.Text_IO; 

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

在一個更大的計劃,你可能需要用「Flush」來關注它;因爲上述內容可能會被I/O包緩衝,這可能不會意識到這是一個特殊的終端命令。 (C相同,我認爲:fflush(stdout);。)