ANSI跳脫序列
ANSI跳脫序列(ANSI escape sequences)是一種帶內訊號的跳脫序列標準,用於控制影片文字終端上的游標位置、顏色和其他選項。在文字中嵌入確定的位元組序列,大部分以ESC
跳脫字元和"["字元開始,終端會把這些位元組序列解釋為相應的指令,而不是普通的字元編碼。
標準 |
|
---|---|
分類 | ISO/IEC 2022基於控制字元的跳脫序列 |
其他相關編碼 | 其它控制字元標準:ITU T.101,JIS X 0207,ISO 6630,DIN 31626,ETS 300 706 |
ANSI序列是在二十世紀七十年代引入的標準,用以取代特定於終端供應商的序列,並在二十世紀八十年代早期開始在電腦裝置市場上廣泛使用。與早期缺少游標移動功能的系統相比,新生的電子公告板系統使用ANSI序列改進其顯示。正是因為這個原因,ANSI序列變成了所有製造商共同採用的標準。
在21世紀,儘管硬體文字終端已經越來越少了,但ANSI標準依然存在,因為大多數終端模擬器會對部分ANSI跳脫序列進行解釋。一個值得注意的例外是,在微軟Windows 10更新TH2之前,Windows作業系統的Win32控制台是不支援ANSI跳脫序列的。
歷史
最初,幾乎每個影片終端製造商都各自添加了特定的跳脫序列用於執行一些特殊操作,比如把游標置於螢幕上的某個位置。舉例來說,VT52終端允許通過傳送ESC
字元、y
字元,後面跟上兩個等於x,y位置的數值加上32的字元(這是為了從ASCII空格字元開始,並避開控制字元),將游標置於螢幕上的x,y位置。
由於這些序列對於不同的終端並不一樣,因此人們不得不開發了一些複雜的庫(比如termcap)和實用程式(比如tput),以便程式可以使用同一套API應對各種終端。另外,在很多終端中需要藉助字元的二進制值傳送數字(如行和列)。對於某些程式語言,以及內部不使用ASCII的系統來說,把數字轉換為正確的字元常常是有困難的,甚至完全做不到。
ANSI標準試圖解決這些問題。標準制訂了一種所有終端共享的指令集,並要求用ASCII的數字字元傳遞所有數值資訊。該系列的第一個標準是1976年通過的ECMA-48。它是一系列字元編碼標準的延續,其中第一個是從1965年的ECMA-6,一個7位標準,ISO 646就源自此標準。「ANSI跳脫序列」的名稱可以追溯到1979年ANSI採用ANSI X3.64。此外,ANSI X3L2委員會與ECMA委員會TC 1合作制訂了一個幾乎一模一樣的標準。以上兩個標準合併為ISO 6429的國際標準[1]。1994年,ANSI取消了其標準,以支援國際標準。
第一個支援這個標準的流行影片終端是1978年推出的Digital VT100[2]。這個終端在市場上非常成功,引發了各種各樣的仿製品,其中最早和最流行的是1979年的Zenith Z-19[3]。其他品牌還有Qume QVT-108,Televideo TVI-970,Wyse WY-99GT。另外,許多其他品牌的終端也不同程度地相容可選的「VT100」、「VT103」或「ANSI」模式。 隨著越來越多的軟體(尤其是BBS系統)普及,越來越多的軟體依賴跳脫序列起作用,導致幾乎所有新的終端和終端模擬器都支援了此標準。
1981年,ANSI X3.64被美國政府採用(FIPS 86)。後來,美國政府停止複製行業標準,所以FIPS 86又被撤回了[4]。
ECMA-48已經經歷了多次更新換代,目前是從1991年開始的第5版。它也被ISO和IEC用作標準ISO/IEC 6429。
平台支援
類Unix系統和AmigaOS
隨著諸多BBS和線上服務廣泛使用ANSI,到20世紀80年代中期,ANSI幾乎得到了全平台支援。儘管許多作業系統在標準文字輸出中越來越多地支援ANSI,但大多數情況下ANSI支援是由終端模擬器完成的(例如Unix/Linux上的xterm、GNOME終端、Konsole,MacOS上的OS X Terminal或ZTerm,以及IBM PC上的許多通訊程式)。
Unix和AmigaOS都在作業系統中包含了對ANSI的一些支援,因此在這些平台上執行的程式廣泛使用ANSI。 類Unix作業系統可以通過像termcap和curses函式庫之類的庫來生成ANSI代碼,許多軟體使用這些庫升級顯示方式。這些庫也應該支援非ANSI終端,但是現在很少有人測試,所以很可能已經不起作用了[來源請求]。許多遊戲和shell指令碼直接輸出ANSI序列(如彩色的提示資訊),因此無法在不支援ANSI的終端上執行。
AmigaOS不僅支援輸出到螢幕上的文字使用ANSI序列,還支援印表機驅動程式使用ANSI序列(需要AmigaOS的專有擴充,這會將它們轉換為與特定印表機實際通訊所需的代碼[5])。
儘管ANSI很普及,卻並沒有得到全平台支援。比如原始的「經典」Mac OS就沒有內建對ANSI的支援,再比如Atari ST使用的是VT52改編的命令系統,需要用一些擴充程式來支援顏色顯示[6]。
Windows和DOS
MS-DOS 1.x不支援ANSI或任何其他跳脫序列,只有少數控制字元(BEL、CR、LF、BS)可以由底層BIOS解釋,所以幾乎[nb 1]不可能做出任何全螢幕應用程式。所有顯示效果都必須通過BIOS呼叫,或者直接控制IBM PC硬體來完成,呼叫速度非常慢。
DOS 2.0引入了添加裝置驅動程式來支援ANSI跳脫序列的功能(事實上的標準是ANSI.SYS,但也使用了ANSI.COM[7]、NANSI.SYS[8]和ANSIPLUS.EXE等其他程式。因為繞過了BIOS,所以這些程式的速度比以前快了不少)。但由於實際執行速度仍然比較慢,以及預設並沒有安裝,所以還是很少得到利用。應用程式往往還是繼續用直接控制硬體的方式來顯示所需的文字[來源請求]。ANSI.SYS和類似的驅動程式繼續在Windows 9x上工作,直到Windows Me,在NT衍生系統中用於在NTVDM下執行的16位元傳統程式。
Win32控制台完全不支援ANSI跳脫序列。不過有一些控制台的替代品或者附加軟體具有解釋程式輸出的ANSI跳脫序列的功能,例如JP Software的TCC(以前的4NT)、Michael J. Mefford的ANSI.COM、Jason Hood的ANSICON[9]和Maximus5的ConEmu。有一個Python軟體套件[10]在內部解釋了列印文字中的ANSI跳脫序列,將它們轉換為系統呼叫來操縱顏色和游標位置,以便更容易地將使用ANSI的Python代碼移植到Windows。
2016年,在Windows 10發布「Threshold 2」[11]時,微軟開始在控制台應用程式中支援ANSI跳脫序列,使得從Unix移植軟體或者遠端訪問Unix變得更容易。這是與Windows Subsystem for Linux一起完成的,允許基於終端的類Unix軟體在Win32控制台中使用跳脫序列。2019年,微軟推出了Windows Terminal,並且正在用其替換掉Win32控制台[12]
跳脫序列
序列具有不同的長度。所有序列都以ASCII字元ESC
(27 / 十六進制 0x1B)開頭,第二個位元組則是0x40–0x5F(ASCII @A–Z[\]^_
)範圍內的字元。[13]:5.3.a
標準規定,在8位元環境中,這兩個位元組的序列可以合併為0x80-0x9F範圍內的單個位元組(詳情請參閱C1控制字元集)。但是,在現代裝置上,這些代碼通常用於其他目的,例如UTF-8的一部分或CP-1252字元,因此並不使用這種合併的方式。
除ESC之外的其他C0代碼(通常是BEL,BS,CR,LF,FF,TAB,VT,SO和SI)在輸出時也可能會產生與某些控制序列相似或相同的效果。
序列 | C1 | 名稱 | 作用 |
---|---|---|---|
ESC N | 0x8e | SS2 – Single Shift Two | 從其中一個替代字元集中選擇一個字元。在xterm中,SS2選擇G2字元集,SS3選擇G3字元集。[14] |
ESC O | 0x8f | SS3 – Single Shift Three | |
ESC P | 0x90 | DCS – 裝置控制字串(Device Control String) | 控制裝置。在xterm中,這個序列的使用包括定義使用者自訂的金鑰,以及請求或設定Termcap/Terminfo資料。[14] |
ESC [ | 0x9b | CSI - 控制序列匯入器(Control Sequence Introducer) | 大部分有用的序列,請參閱下一節。結束於ASCII 64到126 (@ 到~ /十六進制0x40到0x7E).[13]
|
ESC \ | 0x9c | ST – 字串終止(String Terminator) | 終止其他控制項(包括APC,DCS,OSC,PM和SOS)中的字串。[13]:8.3.143 |
ESC ] | 0x9d | OSC – 作業系統命令(Operating System Command) | 啟動作業系統使用的控制字串。OSC序列與CSI序列相似,但不限於整數參數。通常,這些控制序列由ST終止[13]:8.3.89。在xterm中,它們也可能被BEL終止[14]。例如,在xterm中,窗口標題可以這樣設定:OSC 0;this is the window title BEL 。
|
ESC X | 0x98 | SOS – 字串開始(Start of String) | 參照由ST終止的一串文字的參數。這些字串控制序列的用途由應用程式[13]:8.3.2,8.3.128或私有規則來定義[13]:8.3.94。這些函式沒有實現,參數被xterm忽略[14]。 |
ESC ^ | 0x9e | PM – 私有訊息(Privacy Message) | |
ESC _ | 0x9f | APC – 應用程式命令(Application Program Command) | |
ESC c | RIS – 重設為初始狀態(Reset to Initial State) | 將裝置重設為原始狀態。可能包括(如果適用的話):重設圖形格式,清除制表符,重設為預設字型等等。 |
按下鍵盤上的特殊鍵,以及輸出xterm CSI、DCS或OSC序列,常常用於產生從終端傳送到電腦的CSI,DCS或OSC序列,就像使用者使用鍵盤輸入的一樣。
CSI序列
CSI序列由ESC [
、若干個(包括0個)「參數位元組」、若干個「中間位元組」,以及一個「最終位元組」組成。各部分的字元範圍如下:
組成部分 | 字元範圍 | ASCII |
---|---|---|
參數位元組 | 0x30–0x3F | 0–9:;<=>?
|
中間位元組 | 0x20–0x2F | 空格、!"#$%&'()*+,-./
|
最終位元組 | 0x40–0x7E | @A–Z[\]^_`a–z{|}~
|
所有常見的序列都只是把參數用作一系列分號分隔的數字,如1;2;3
。缺少的數字視為0(如1;;3
相當於中間的數字是0,ESC[m
這樣沒有參數的情況相當於參數為0)。某些序列(如CUU)把0視為1,以使缺少參數的情況下有意義:F.4.2。
一部分字元定義是「私有」的,以便終端製造商可以插入他們自己的序列而不與標準相衝突。包括參數位元組<=>?
的使用,或者最終位元組0x70–0x7F(p–z{|}~
)例如VT320序列CSI?25h
和CSI?25l
的作用是打開和關閉游標的顯示。
當CSI序列含有超出0x20–0x7E範圍的字元時,其行為是未定義的。這些非法字元包括C0控制字元(範圍0–0x1F)、DEL(0x7F),以及高位位元組。
代碼 | 名稱 | 作用
|
---|---|---|
CSI n A |
CUU – 游標上移(Cursor Up) | 游標向指定的方向移動 (預設1)格。如果游標已在螢幕邊緣,則無效。
|
CSI n B |
CUD – 游標下移(Cursor Down)
| |
CSI n C |
CUF – 游標前移(Cursor Forward)
| |
CSI n D |
CUB – 游標後移(Cursor Back) | |
CSI n E |
CNL – 游標移到下一行(Cursor Next Line) | 游標移動到下面第 (預設1)行的開頭。(非ANSI.SYS) |
CSI n F |
CPL – 游標移到上一行(Cursor Previous Line) | 游標移動到上面第 (預設1)行的開頭。(非ANSI.SYS) |
CSI n G |
CHA – 游標水平絕對(Cursor Horizontal Absolute) | 游標移動到第 (預設1)列。(非ANSI.SYS)
|
CSI n ; m H |
CUP – 游標位置(Cursor Position) | 游標移動到第 行、第 列。值從1開始,且預設為1 (左上角)。例如CSI ;5H 和CSI 1;5H 含義相同;CSI 17;H 、CSI 17H 和CSI 17;1H 三者含義相同。
|
CSI n J |
ED – 擦除顯示(Erase in Display) | 清除螢幕的部分割區域。如果 是0(或缺失),則清除從游標位置到螢幕末尾的部分。如果 是1,則清除從游標位置到螢幕開頭的部分。如果 是2,則清除整個螢幕(在DOS ANSI.SYS中,游標還會向左上方移動)。如果 是3,則清除整個螢幕,並刪除轉返快取區中的所有行(這個特性是xterm添加的,其他終端應用程式也支援)。
|
CSI n K |
EL – 擦除行(Erase in Line) | 清除行內的部分割區域。如果 是0(或缺失),清除從游標位置到該行末尾的部分。如果 是1,清除從游標位置到該行開頭的部分。如果 是2,清除整行。游標位置不變。
|
CSI n S |
SU – 向上捲動(Scroll Up) | 整頁向上捲動 (預設1)行。新行添加到底部。(非ANSI.SYS)
|
CSI n T |
SD – 向下捲動(Scroll Down) | 整頁向下捲動 (預設1)行。新行添加到頂部。(非ANSI.SYS)
|
CSI n ; m f |
HVP – 水平垂直位置(Horizontal Vertical Position) | 同CUP。
|
CSI n m |
SGR – 選擇圖形再現(Select Graphic Rendition) | 設定SGR參數,包括文字顏色。CSI後可以是0或者更多參數,用分號分隔。如果沒有參數,則視為CSI 0 m (重設/常規)。
|
CSI 5i | 打開輔助埠 | 啟用輔助序列埠,通常用於本地串行印表機
|
CSI 4i | 關閉輔助埠 | 禁用輔助序列埠,通常用於本地串行印表機
|
CSI 6n | DSR – 裝置狀態報告(Device Status Report) | 以ESC[n;mR (就像在鍵盤上輸入)向應用程式報告游標位置(CPR),其中 是行, 是列。
|
CSI s | SCP – 儲存游標位置(Save Cursor Position) | 儲存游標的當前位置。
|
CSI u | RCP – 恢復游標位置(Restore Cursor Position) | 恢復儲存的游標位置。 |
選擇圖形再現(SGR)參數
代碼 | 作用 | 備註 |
---|---|---|
0 | 重設/正常 | 關閉所有屬性。 |
1 | 粗體或增加強度 | |
2 | 弱化(降低強度) | 未廣泛支援。 |
3 | 斜體 | 未廣泛支援。有時視為反相顯示。 |
4 | 底線 | |
5 | 緩慢閃爍 | 低於每分鐘150次。 |
6 | 快速閃爍 | MS-DOS ANSI.SYS;每分鐘150以上;未廣泛支援。 |
7 | 反顯 | 前景色與背景色交換。 |
8 | 隱藏 | 未廣泛支援。 |
9 | 劃除 | 字元清晰,但標記為刪除。未廣泛支援。 |
10 | 主要(預設)字型 | |
11–19 | 替代字型 | 選擇替代字型 。 |
20 | 尖角體 | 幾乎無支援。 |
21 | 關閉粗體或雙底線 | 關閉粗體未廣泛支援;雙底線幾乎無支援。 |
22 | 正常顏色或強度 | 不強不弱。 |
23 | 非斜體、非尖角體 | |
24 | 關閉底線 | 去掉單雙底線。 |
25 | 關閉閃爍 | |
27 | 關閉反顯 | |
28 | 關閉隱藏 | |
29 | 關閉劃除 | |
30–37 | 設定前景色 | 參見下面的顏色表。 |
38 | 設定前景色 | 下一個參數是5;n 或2;r;g;b ,見下。
|
39 | 預設前景色 | 由具體實現定義(按照標準)。 |
40–47 | 設定背景色 | 參見下面的顏色表。 |
48 | 設定背景色 | 下一個參數是5;n 或2;r;g;b ,見下。
|
49 | 預設背景色 | 由具體實現定義(按照標準)。 |
51 | Framed | |
52 | Encircled | |
53 | 上劃線 | |
54 | Not framed or encircled | |
55 | 關閉上劃線 | |
60 | 表意文字底線或右邊線 | 幾乎無支援。 |
61 | 表意文字雙底線或雙右邊線 | |
62 | 表意文字上劃線或左邊線 | |
63 | 表意文字雙上劃線或雙左邊線 | |
64 | 表意文字著重標誌 | |
65 | 表意文字屬性關閉 | 重設60 –64 的所有效果。
|
90–97 | 設定明亮的前景色 | aixterm(非標準)。 |
100–107 | 設定明亮的背景色 | aixterm(非標準)。 |
顏色
3/4位元
初始的規格只有8種顏色,只給了它們的名字。SGR參數30-37選擇前景色,40-47選擇背景色。相當多的終端將「粗體」(SGR代碼1)實現為更明亮的顏色而不是不同的字型,從而提供了8種額外的前景色,但通常情況下並不能用於背景色,雖然有時候反顯(SGR代碼7)可以允許這樣。例如:在白色背景上顯示黑色文字使用ESC[30;47m
,顯示紅色文字用ESC[31m
,顯示明亮的紅色文字用ESC[1;31m
。重設為預設顏色用ESC[39;49m
(某些終端不支援),重設所有屬性用ESC[0m
。後來的終端新增了功能,可以直接用90-97和100-107指定「明亮」的顏色。
當硬體開始使用8位元DAC時,多個軟體為這些顏色名稱分配了24位元的代碼。下面的圖表顯示了傳送到DAC的一些常用硬體和軟體的值。[來源請求]
名稱 | 前景色代碼 | 背景色代碼 | VGA[nb 2] | CMD[nb 3] | Terminal.app | PuTTY | mIRC | xterm | X[nb 4] | Ubuntu[nb 5] |
---|---|---|---|---|---|---|---|---|---|---|
黑 | 30 | 40 | 0,0,0 | 1,1,1 | ||||||
紅 | 31 | 41 | 170,0,0 | 128,0,0 | 194,54,33 | 187,0,0 | 127,0,0 | 205,0,0 | 255,0,0 | 222,56,43 |
綠 | 32 | 42 | 0,170,0 | 0,128,0 | 37,188,36 | 0,187,0 | 0,147,0 | 0,205,0 | 0,255,0 | 57,181,74 |
黃 | 33 | 43 | 170,85,0[nb 6] | 128,128,0 | 173,173,39 | 187,187,0 | 252,127,0 | 205,205,0 | 255,255,0 | 255,199,6 |
藍 | 34 | 44 | 0,0,170 | 0,0,128 | 73,46,225 | 0,0,187 | 0,0,127 | 0,0,238[15] | 0,0,255 | 0,111,184 |
品紅 | 35 | 45 | 170,0,170 | 128,0,128 | 211,56,211 | 187,0,187 | 156,0,156 | 205,0,205 | 255,0,255 | 118,38,113 |
青 | 36 | 46 | 0,170,170 | 0,128,128 | 51,187,200 | 0,187,187 | 0,147,147 | 0,205,205 | 0,255,255 | 44,181,233 |
白 | 37 | 47 | 170,170,170 | 192,192,192 | 203,204,205 | 187,187,187 | 210,210,210 | 229,229,229 | 255,255,255 | 204,204,204 |
亮黑(灰) | 90 | 100 | 85,85,85 | 128,128,128 | 129,131,131 | 85,85,85 | 127,127,127 | 127,127,127 | 128,128,128 | |
亮紅 | 91 | 101 | 255,85,85 | 255,0,0 | 252,57,31 | 255,85,85 | 255,0,0 | 255,0,0 | 255,0,0 | |
亮綠 | 92 | 102 | 85,255,85 | 0,255,0 | 49,231,34 | 85,255,85 | 0,252,0 | 0,255,0 | 144,238,144 | 0,255,0 |
亮黃 | 93 | 103 | 255,255,85 | 255,255,0 | 234,236,35 | 255,255,85 | 255,255,0 | 255,255,0 | 255,255,224 | 255,255,0 |
亮藍 | 94 | 104 | 85,85,255 | 0,0,255 | 88,51,255 | 85,85,255 | 0,0,252 | 92,92,255[16] | 173,216,230 | 0,0,255 |
亮品紅 | 95 | 105 | 255,85,255 | 255,0,255 | 249,53,248 | 255,85,255 | 255,0,255 | 255,0,255 | 255,0,255 | |
亮青 | 96 | 106 | 85,255,255 | 0,255,255 | 20,240,240 | 85,255,255 | 0,255,255 | 0,255,255 | 224,255,255 | 0,255,255 |
亮白 | 97 | 107 | 255,255,255 | 255,255,255 | 233,235,235 | 255,255,255 | 255,255,255 | 255,255,255 | 255,255,255 |
8位元
隨著256色尋找表在顯示卡上越來越常見,相應的跳脫序列也增加了,以從預定義的256種顏色中選擇:[17]
ESC[ … 38;5;<n> … m
选择前景色(n是下表中的一种)ESC[ … 48;5;<n> … m
选择背景色 0- 7:标准颜色(同ESC [ 30–37 m
) 8- 15:高强度颜色(同ESC [ 90–97 m
) 16-231:6 × 6 × 6 立方(216色): 16 + 36 × r + 6 × g + b (0 ≤ r, g, b ≤ 5) 232-255:从黑到白的24阶灰度色
ITU的T.416資訊科技-開放文件體系結構(ODA)和交換格式:字元內容體系結構[18]使用「:」作為分隔符:
ESC[ … 38:5:<n> … m
选择前景色(n是下表中的一种)ESC[ … 48:5:<n> … m
选择背景色
256色模式 — 前景色:ESC[38;5;#m 背景色:ESC[48;5;#m
| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
標準色 | 高強度色 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
216色 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | ||||||||||||||||||||||||
52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | ||||||||||||||||||||||||
88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | 122 | 123 | ||||||||||||||||||||||||
124 | 125 | 126 | 127 | 128 | 129 | 130 | 131 | 132 | 133 | 134 | 135 | 136 | 137 | 138 | 139 | 140 | 141 | 142 | 143 | 144 | 145 | 146 | 147 | 148 | 149 | 150 | 151 | 152 | 153 | 154 | 155 | 156 | 157 | 158 | 159 | ||||||||||||||||||||||||
160 | 161 | 162 | 163 | 164 | 165 | 166 | 167 | 168 | 169 | 170 | 171 | 172 | 173 | 174 | 175 | 176 | 177 | 178 | 179 | 180 | 181 | 182 | 183 | 184 | 185 | 186 | 187 | 188 | 189 | 190 | 191 | 192 | 193 | 194 | 195 | ||||||||||||||||||||||||
196 | 197 | 198 | 199 | 200 | 201 | 202 | 203 | 204 | 205 | 206 | 207 | 208 | 209 | 210 | 211 | 212 | 213 | 214 | 215 | 216 | 217 | 218 | 219 | 220 | 221 | 222 | 223 | 224 | 225 | 226 | 227 | 228 | 229 | 230 | 231 | ||||||||||||||||||||||||
灰度色 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
24位元
隨著16位元到24位元顏色的「真彩色」顯示卡的普及,Xterm[14]、KDE的Konsole[19],以及所有基於libvte的終端[20](包括GNOME終端)支援了ISO-8613-3的24位元前景色和背景色設定。[17]
ESC[ … 38;2;<r>;<g>;<b> … m
选择RGB前景色ESC[ … 48;2;<r>;<g>;<b> … m
选择RGB背景色
作為ISO / IEC國際標準8613-6採用的ITU的T.416資訊科技-開放文件體系結構(ODA)和交換格式:字元內容體系結構[18]給出了一個似乎不太受支援的替代版本:
ESC[ … 38:2:<Color-Space-ID>:<r>:<g>:<b>:<unused>:<CS tolerance>:<Color-Space: 0="CIELUV"; 1="CIELAB">m
选择RGB前景色ESC[ … 48:2:<Color-Space-ID>:<r>:<g>:<b>:<unused>:<CS tolerance>:<Color-Space: 0="CIELUV"; 1="CIELAB">m
选择RGB背景色
請注意,這裡使用了保留的「:」字元來分隔子選項,這可能是在實際實現中造成混淆的始作俑者。它還使用「3」作為第二個參數來指定使用青-品紅-黃方案的方案,「4」用於青-品紅-黃-黑的方案,後者使用上面標記為「unused」(「未使用」)的位置作為黑色組件。
還要注意,許多辨識「:」作為分隔符的實現錯誤地忽視了色彩空間識別碼參數,並因此改變了其餘部分的位置。
範例
CSI 2 J
— 清除螢幕、(在某些裝置上)把游標置於1,1位置(左上角)。
CSI 32 m
— 使文字呈綠色。在MS-DOS上,一般綠色是暗淡的綠色,可以用CSI 1 m
啟用粗體使其變成明亮的綠色,或者將兩者合併為CSI 32 ; 1 m
。MS-DOS ANSI.SYS用粗體狀態使字元變亮,閃爍狀態(通過INT 10, AX 1003h, BL 00h
)使背景色變成明亮模式。MS-DOS ANSI.SYS並不直接支援SGR代碼90–97和100–107。
CSI 0 ; 6 8 ; "DIR" ; 13 p
— 重新分配F10鍵的功能為傳送字串「DIR」和回車字元到鍵盤快取中,在DOS命令列里會顯示當前目錄的內容(僅MS-DOS ANSI.SYS)。這種序列有時用於「ANSI炸彈」。這是一個私用編碼(如字母p所示),用非標準的擴充使其包含一個字串參數。如果按標準,會認為字母D是序列的末尾。
CSI s
— 儲存游標的位置。用序列CSI u
會把游標重設回這個位置。假設當前的游標位置是7(y)、10(x)。序列CSI s
會儲存這兩個數值。現在可以把游標移動到其他位置,比如用序列CSI 20 ; 3 H
或CSI 20 ; 3 f
把游標移動到20(y)、3(x)。現在如果用序列CSI u
,游標會回到7(y)、10(x)。某些終端需要使用DEC序列ESC 7
/ESC 8
,這得到了更廣泛的支援。
使用Shell指令碼的範例
ANSI轉移代碼常常用於UNIX和類UNIX終端,以提供語法突顯功能。例如,在相容的終端上,以下ls命令按類型對檔案和目錄的名稱進行顏色編碼。
ls --color
使用者可以在指令碼中使用跳脫碼,將其作為標準輸出或標準錯誤輸出的一部分。例如,下面的GNU sed命令通過反顯「WARN」開頭的單詞的行,以及使用暗紅色背景色和亮黃色前景色顯示以「ERR」開頭的單詞(字母大小寫被忽略)的行來修飾make命令的輸出。突出顯示了設定ANSI代碼的部分。[21]
make 2>&1 | sed -e 's/.*\bWARN.*/\x1b[7m&\x1b[0m/i' -e 's/.*\bERR.*/\x1b[93;41 m&\x1b[0m/i'
以下Bash函式會使終端閃爍(通過交替傳送反相和正常顯示模式代碼),直到使用者按下任意鍵[22]。這個函式可以用於當一個冗長的命令終止時提醒使用者,用法如make; flasher
[23]。
flasher () { while true; do printf \\e[?5h; sleep 0.1; printf \\e[?5l; read -s -n1 -t1 && break; done; }
下面這個命令可以重設控制台,類似現代Linux系統的reset
命令。然而,即使在較早的Linux系統和其他(非Linux)UNIX變體上,也應該能起作用。
printf \\033c
參見
註腳
- ^ 螢幕顯示可以通過從底部繪製整個新螢幕的內容來替代,捲動上一螢幕以充分擦除所有舊文字內容。使用者會看到捲動,硬體游標會留在最底部。 一些早期的批次檔以這種方式實現了基本的「全螢幕」顯示。
- ^ 在啟動PC並將其保留在文字模式下時使用的典型顏色,使用16個條目的顏色表。EGA/VGA圖形模式中的顏色不同。
- ^ 從Windows XP起
- ^ 以上顏色名稱來自X11 rgb.txt顏色資料庫,用「light」作為明亮顏色的字首。
- ^ 用於虛擬終端,來自/etc/vtrgb。
- ^ 在基於CGA相容硬體(如在DOS上執行的ANSI.SYS)的終端上,正常強度的前景色呈現為橙色。 CGA RGBI顯示器包含一些硬體,通過減少綠色成分將深黃色修改為橙色/棕色。
參考資料
- ^ Historical version of ECMA-48 (PDF). [2018-01-12]. (原始內容存檔 (PDF)於2016-11-09).
- ^ Williams, Paul. Digital's Video Terminals. VT100.net. 2006 [2011-08-17]. (原始內容存檔於2012-07-23).
- ^ Heathkit Company. Heathkit Catalog 1979. Heathkit Company. 1979 [2011-11-04]. (原始內容存檔於2012-01-13).
- ^ Withdrawn FIPS Listed by Number (PDF). [2018-01-12]. (原始內容存檔 (PDF)於2016-06-14).
- ^ Amiga Printer Command Definitions. Commodore. [2013-07-10]. (原始內容存檔於2014-07-14).
- ^ "Using C-Kermit", p. 88.
- ^ Mefford, Michael. ANSI.com: Download It Here. PC Magazine. 1989-02-07 [2011-08-10]. (原始內容存檔於2012-01-24). 參數
|journal=
與模板{{cite web}}
不匹配(建議改用{{cite journal}}
或|website=
) (幫助) - ^ Kegel, Dan; Auer, Eric. Nansi and NNansi – ANSI Drivers for MS-DOS. Dan Kegel's Web Hostel. 1999-02-28 [2011-08-10]. (原始內容存檔於2018-05-19).
- ^ Hood, Jason. Process ANSI escape sequences for Windows console programs. Jason Hood's Home page. 2005 [2013-05-09]. (原始內容存檔於2014-07-29).
- ^ colorama 0.2.5 :. Python Package Index. [2013-08-17]. (原始內容存檔於2013-10-22).
- ^ Grehan, Oisin. Windows 10 TH2 (v1511) Console Host Enhancements. 2016-02-04 [2016-02-10]. (原始內容存檔於2016-02-09).
- ^ Windows Console and Terminal Ecosystem Roadmap. Microsoft. 2018 [2021-03-13]. (原始內容存檔於2022-08-27).
這包括將經典Win32控制台從其預設位置停用,以支援Windows終端、ConPTY和虛擬終端序列。
- ^ 13.0 13.1 13.2 13.3 13.4 13.5 13.6 Standard ECMA-48: Control Functions for Coded Character Sets Fifth. Ecma International. June 1991 [2018-01-12]. (原始內容存檔於2008-09-18).
- ^ 14.0 14.1 14.2 14.3 14.4 XTerm Control Sequences. invisible-island.net. 2014-01-13 [2014-04-13]. (原始內容存檔於2007-03-12).
- ^ Changed from 0,0,205 in July 2004 Patch #192 – 2004/7/12 – XFree86 4.4.99.9. [2018-01-12]. (原始內容存檔於2001-12-22).
- ^ Changed from 0,0,255 in July 2004 Patch #192 – 2004/7/12 – XFree86 4.4.99.9. [2018-01-12]. (原始內容存檔於2001-12-22).
- ^ 17.0 17.1 README.moreColors. KDE. 2010-04-22.[永久失效連結]
- ^ 18.0 18.1 T.416 Information technology - Open Document Architecture (ODA) and interchange format: Character content architectures. [2018-01-12]. (原始內容存檔於2016-03-03).
- ^ color-spaces.pl (a copy of 256colors2.pl from xterm dated 1999-07-11). KDE. 2006-12-06.[永久失效連結]
- ^ libvte's bug report and patches. GNOME Bugzilla. 2014-04-04 [2016-06-05]. (原始內容存檔於2015-09-03).
- ^ Chapter 9. System tips. debian.org. [2018-01-12]. (原始內容存檔於2018-01-29).
- ^ VT100.net: Digital VT100 User Guide. [2015-01-19]. (原始內容存檔於2015-04-15).
- ^ bash – How to get a notification when my commands are done – Ask Different. [2015-01-19]. (原始內容存檔於2015-01-19).
外部連結
- Standard ECMA-48, Control Functions For Coded Character Sets(頁面存檔備份,存於網際網路檔案館). (5th edition, June 1991), European Computer Manufacturers Association, Geneva 1991 (also published by ISO and IEC as standard ISO/IEC 6429)
- vt100.net DEC DocumentsArchive.is的存檔,存檔日期2013-02-22
- ANSI.SYS -- ansi terminal emulation escape sequences. [2018-01-12]. (原始內容存檔於2006-02-06).
- Xterm / Escape Sequences(頁面存檔備份,存於網際網路檔案館)
- AIXterm / Escape Sequences[永久失效連結]
- A collection of escape sequences for terminals that are vaguely compliant with ECMA-48 and friends.(頁面存檔備份,存於網際網路檔案館)
- ANSI Escape Sequences(頁面存檔備份,存於網際網路檔案館)
- ITU-T Rec. T.416 (03/93) Information technology – Open Document Architecture (ODA) and interchange format: Character content architectures(頁面存檔備份,存於網際網路檔案館)