某些程式如何設定背景和字體顏色,將字元多次寫入螢幕上的相同位置(例如第三行,第五列)?
curl google.com > a
一些範例是由、一些安裝畫面和幾乎所有文字編輯器顯示的進度條。
答案1
你問的並不是真正的圖形API,它只是終端控製字元。
它背後有很多歷史,但當時的終端是電傳打字機機器。基本上是一台帶有軌道送紙的打字機,透過串列連接連接到電腦。鍵入字元會將二進位值傳送到電腦(並在頁面上鍵入它)。計算機將列印回字元作為您所要求的任何內容的輸出。
特殊字元用於控制終端(這是控制鍵的來源,它用於產生這些字元)。例如,^H
或是^?
退格鍵,^M
是回車符(將遊標移到行首),^J
是換行符(將頁面向上移動一行)。一些控製程式碼在 C 中具有轉義序列(幾乎所有程式語言都共用)來產生控製字元。前面所列的控制項分別是\b
、\r
。\n
這終端仿真器您今天使用的軟體就像聽起來一樣,它偽裝成一台舊的電傳打字機。在某種程度上,就好像 Unix 仍然認為您正在使用打字機與其進行通訊一樣。
在 的情況下curl
,它會寫入整行,然後發送\r
(回車)將遊標移至該行的開頭,然後寫入另一行。由於未發送換行符,因此它會繼續在螢幕上的同一行上寫入。
您可以嘗試透過以下方法來證明這一點:
echo -n "First" ; sleep 5 ; echo -en "\rSecond\n"
您將看到列印出“First”一詞(但不會發送新行)。 5 秒後,它將被單字“Second”替換,並發送新行。您可以無限期地重複此模式。嘗試自己添加“第三”,您會看到一些您可能沒有想到的東西;-)
有關這些和其他控製字元的更多信息,請參閱ascii(7)
手冊。
答案2
你在尋找類似的東西嗎恩詛咒?
答案3
這個問題實際上是幾個問題,並且“控製字元”僅解決其中的一小部分,例如 的進度條curl
。更一般地說,這些是終端(和終端模擬器)的共同特徵。
大多數這些共同特徵都已標準化ECMA-48:編碼字元集的控制函數。然而,其他功能是不是。它們是實現定義的。
ECMA-48 指的是控制功能。包括控製字元和控制序列(通常稱為轉義序列、ANSI 序列等)。
一些控製字元用於簡單的操作,例如
- 將遊標移到同一行的上一列
- 將遊標移到同一行的第一列
- 將遊標移到同一行的下一個製表位
- 將遊標移到下一行(並滾動螢幕如果已經在最後一行了)
進度條curl
是使用這些簡單的操作建立的。但控製字元只能做這麼多,僅此而已。控制序列可以做更多的事情,例如,
- 將遊標移到螢幕上的任何行/列
- 將遊標移到螢幕上同一列的任一行
- 將遊標移到螢幕上同一行的任何列
- 在螢幕上的任何列設定製表位
- 將遊標移至上一行
- 使螢幕向上或向下捲動而不移動遊標
簡單/複雜之間的相似之處就這麼多。控制序列也用於更改文字和背景的顏色、從螢幕上刪除文字、以反白方式顯示文字(或粗體、底線、閃爍)。
繪製反向視訊(或彩色)進度條的程序控制序列。
儘管控制序列可以做更多的事情,但它們只能做特定的事情。將它們放在一起來製作文字編輯器、安裝螢幕(以及繪製彩色進度條的程式)會變得很複雜。透過使用了解這些事情的庫可以使其中一些變得更簡單。最初,我們有 termcap(以及數百種終端的資料庫),擴展到 terminfo(以及大約一千種終端的資料庫)。
即使採用標準化,您也可以使用數十種終端描述使用。因此,除了最瑣碎的應用程式之外,我們繼續將程式庫用於所有應用程式。一種是 ncurses(“new-curses”),另一種是 slang(技術上是“S-Lang”)。
延伸閱讀: