Arch manual pages

CONSOLE_CODES(4) Linux Programmer's Manual CONSOLE_CODES(4)

控制終端代碼 - Linux 控制終端轉義和控制序列

Linux控制檯實現了VT102和ECMA-48/ISO 6429/ANSI X3.64終端控制的子集, 這個子集很龐大,當然還有Linux自己私有的控制序列,以改變顏色配置,字符 集映像,等等.在下面將要給出的表格中,第二列爲指定的功能給出了ECMA-48 或者DEC助記符(如果是後者會在前面加有DEC前綴).沒有給出助記符的序列 既不是ECMA-48也不是VT102字符.

在所有標準輸出進程執行完畢,並且一個字符流被送到控制檯 驅動程序準備顯示出來的時候,所發生的第一件事就是將進程 使用的代碼轉換成顯示使用的代碼.

如果控制檯工作於 UTF-8 模式,那麼輸入的字節會首先編碼 成16位的 Unicode 代碼.如果不是UTF-8模式,那麼每個字節 會按照當前的字符映射表完成轉換(轉換成Unicode編碼的值). 參看下面將要討論的 CHARACTER SETS 一章.

在一般情況下,Unicode 代碼被轉換成爲存儲在視頻存儲器中的 字體索引,這樣對應的具體字符(字符存儲在視頻ROM中)就顯示 在屏幕上了. 注意使用 Unicode 編碼允許我們同時使用 512 種不同的字體(和 計算機硬件有關).

如果當前的 Unicode 代碼是一個控制字符,或者系統目前正在處 理一個轉義序列,處理的方式有些特別.它不會被轉換成字體索 引,也不會直接顯示在屏幕上.它可能控制光標的移動,或者實現 其它控制功能.參看下面的 LINUX CONSOLE CONTROLS 一節 所進行的討論.

一般來說直接在程序中插入終端控制字符並不是很好.Linux 支 持終端兼容的 terminfo(5) 數據庫. 除了直接插入控制和轉義序列,也可以使用象 ncurses(3), tput(1), 或者 reset(1). 這樣的顯示庫或者工具.

這一段描述了所有在Linux控制檯下使用的調用特殊功能的控制字符 和轉義序列(例如.任何不在當前光標處插入可見字符的序列).

當一個字符在通過字符映射錶轉換之前含有以下14個代碼之一的時 候表明它是一個控制字符. 00(NUL),07(BEL),08(BS),09(HT),0a(LF),0b(VT), 0c(FF),0d(CR),0e(SO),0f(SI),18(CAN),1a(SUB), 1b(ESC),7f(DEL). 我們可以通過設置 `顯示控制字符' 模式(見下文)以允許07,09,0b, 18,1a,7f 像普通字符一樣顯示在屏幕上.另一方面,在UTF-8模式下 所有位於 00-1f之間的代碼都被認爲是控制字符,而不管是否處於 `顯示控制字符'模式.

一個控制字符會立刻生效,然後被丟棄(即使是在轉義序列中間), 之後轉義序列才繼續處理下一個字符. (在任何情況下,ESC都表示一個新的轉義序列的開始,可能導致 前一個序列的非正常終止,CAN和SUB 終止任何轉義序列.) 可識別的控制字符是BEL,BS,HT,LF,VT,FF,CR,SO,SI,CAN, SUB,ESC,DEL,CSI.他們的功能如下.:

BEL(0x07,^G)鈴聲;

BS(0x08,^H)後退一格(在行首不起作用);

HT(0x09,^I)跳至下一個製表位.如果後面已沒有製表位則跳至行尾;

LF(0x0A,^J),VT(0x0B,^K),FF(0x0C,^L)三者都表示換行;

CR(0x0D,^M)回車並換行;

SO(0x0E,^N)激活 G1 字符集, 如果設置了 LF/NL(新行模式)還要加上回車換行;

SI(0x0F,^O)激活 G0 字符集;

CAN(0x18,^X),SUB(0x1A,^Z)兩者都表示中斷轉義序列;

ESC(0x1B,^[)開始一個新的轉義序列;

DEL(0x7F)忽略;

CSI(0x9B)等同於 ESC [;

ESC c RIS 重繪屏幕.
ESC D IND 換行.
ESC E NEL 新的一行.
ESC H HTS 設置當前列爲製表位.
ESC M RI 翻轉換行(Reverse linefeed).
ESC Z DECID DEC 私有定義.內核將其解釋爲
VT102字符,返回字符ESC [ ? 6 c.
ESC 7 DECSC 存儲當前狀態(光標座標,
屬性,字符集).
ESC 8 DECRC 恢復上一次儲存的設置
ESC [ CSI 控制序列介紹
ESC % 開始一個字符集選擇序列
ESC % @    選擇默認字符集(ISO 646 / ISO 8859-1)
ESC % G    選擇 UTF-8
ESC % 8    選擇 UTF-8(已不用)
ESC # 8 DECALN DEC 屏幕校準測試 - 以E's填充屏幕.
ESC( 開始一個 G0 字符集定義序列
ESC( B    選擇默認字符集(ISO 8859-1 mapping)
ESC( 0    選擇 vt100 圖形映射
ESC( U    選擇空映射 - 直接訪問字符ROM
ESC( K    選擇用戶映射 - 由程序mapscrn(8)
   加載.
ESC ) 開始一個 G1 字符集定義
(後面跟 B,0,U,K,同上).
ESC > DECPNM 設置數字小鍵盤模式
ESC = DECPAM 設置程序鍵盤模式
ESC ] OSC (是perating system command的縮寫)
ESC ] P nrrggbb: 設置調色板,後面緊跟7個
十六進制數,再跟一個 P :-(.
這裏 n 是顏色(0-16),而 rrggbb 表示
紅/綠/藍 值(0-255).
ESC ] R: 重置調色板

CSI(或者 ESC [)後面跟的參數序列大部分是NPAR(16), 就是由分號隔開的十進制數.空參數或缺少的參數以0處理. 可以用一個問號代替參數序列.

在任何情況下,系統讀取 CSI [(或者 ESC [ [)後的單個字符, 而忽略整個序列.(用於忽略回顯功能鍵.)

CSI 序列的動作由其最後一個字符決定.

@ ICH 用#符號指示空格.
A CUU 光標上移到#標識的行.
B CUD 光標下移到#標識的行.
C CUF 光標右移到#標識的列.
D CUB 光標左移到#標識的列.
E CNL 將光標下移到#指示的行的第一列.
F CPL 將光標上移到#指示的行的第一列.
G CHA 光標移動到當前行的指定列.
H CUP 光標移動到指定行和列(以1行1列爲參照).
J ED 刪除(默認從當前光標處到行尾的)內容.
ESC [ 1 J: 刪除從開始到光標處的內容.
ESC [ 2 J: 清空整個屏幕.
K EL 刪除行(默認從當前光標處到結尾).
ESC [ 1 K: 刪除從行首到當前光標處的內容.
ESC [ 2 K: 刪除整行.
L IL 在空行插入#.
M DL 刪除#標記的行.
P DCH 刪除當前行中#標記的字符.
X ECH 刪除當前行中#標記的單詞.
a HPR 光標移動到#標記的右邊.
c DA 以`I am a VT102'應答 ESC [ ? 6 c:
d VPA 光標移動到當前列指定行
e VPR 光標移動到#標記的下一行.
f HVP 光標移動到指定的行和列.
g TBC 沒有參數: 清除當前位置的製表站.
ESC [ 3 g: 刪除所有制表站.
h SM 設置模式(見下文).
l RM 重置模式(見下文).
m SGR 設置屬性(見下文).
n DSR 狀態報告(見下文).
q DECLL 設置鍵盤指示燈.
ESC [ 0 q: 熄滅所有指示燈
ESC [ 1 q: 點亮 Scroll Lock 燈
ESC [ 2 q: 點亮 Num Lock 燈
ESC [ 3 q: 點亮 Caps Lock 燈
r DECSTBM 設置滾動範圍; 參數爲首行和末行.
s ? 存儲光標位置.
u ? 恢復光標位置.
` HPA 光標移動到當前行指定列.

ECMA-48 SGR 序列 ESC [ <parameters> m 設置顯示屬性. 同樣的序列可以設置一個或多個屬性.

par 作用
0 所有屬性重設爲默認值
1 設置邊框
2 設置亮度減半(用一種顏色模擬另一種顏色)
4 設置底紋(用一種顏色模擬另一種顏色)
(用於模擬的顏色由using ESC ] ...設置)
5 設置閃爍
7 設置反轉視頻(reverse video)
10 重設選定映像,顯示控制標記,
反轉元素標記.
11 選擇空映像,設置顯示控制標記,
重設反轉標記.
12 選擇空映像,設置顯示控制標記,
重設反轉標記.(在完成映像錶轉
換之前反轉標記引起每一字節的
高位反轉.)
21 設置正常亮度(和 ECMA-48 不兼容)
22 設置正常亮度
24 關閉下劃線
25 不閃爍
27 反轉視頻關閉
30 黑色背景
31 紅色前景
32 綠色前景
33 棕色前景
34 藍色前景
35 品紅前景
36 孔雀藍前景
37 白色前景
38 打開下劃線,設置默認前景色
39 關閉下劃線,設置默認前景色
40 黑色背景
41 紅色背景
42 綠色背景
43 棕色背景
44 藍色背景
45 品紅背景
46 孔雀藍背景
47 白色背景
49 設置默認背景色

ESC [ 3 h
DECCRM(默認關閉): 顯示控制字符.
ESC [ 4 h
DECIM(默認關閉): 設置插入模式.
ESC [ 20 h
LF/NL(默認關閉): 自動在CR後加上 LF,VT 或者 FF.

ESC [ 5 n
設備狀態報告(DSR): 以 ESC [ 0 n 應答(終端準備好).
ESC [ 6 n
光標位置報告(CPR): 以ESC [ y ; x R 應答, 這裏 x,y 指光標位置.

這裏給出的序列在 ECMA-48中沒有描述.我們列出了設置模式序列; 用l替換最後一個h就是重設模式序列.
ESC [ ? 1 h
DECCKM(默認關閉): 打開時光標鍵送出 ESC O 前綴, 而不是 ESC [.
ESC [ ? 3 h
DECCOLM(默認 = 80 行): 交替選擇 80/132 行模式.當原顯示 模式不足以滿足要求的時候,象 resizecons(8) 這樣的用戶程序會改變終端顯示卡的硬件註冊.
ESC [ ? 5 h
DECSCNM(默認關閉): 設置視頻反轉模式.
ESC [ ? 6 h
DECOM(默認關閉): 打開時,光標位置用相對於滾動條左上角 的位置表示.
ESC [ ? 7 h
DECAWM(默認關閉): 打開自動換行.在這種模式下,一行中 超過80列的字符將自動換行(在DECCOLM打開時是132列).
ESC [ ? 8 h
DECARM(默認關閉): 打開鍵盤自動重複.
ESC [ ? 9 h
X10 鼠標報告(默認關閉): 設置報告模式 1(或者重設爲 0)- 見下文.
ESC [ ? 25 h
DECCM(默認打開): 設置光標可見.
ESC [ ? 1000 h
X11 鼠標報告(默認關閉): 設置報告模式 2(或者重設爲 0)- 見下文.

下面的序列既不屬於 ECMA-48 字符也不屬於 VT102.它們只在 Linux控制檯上使用.顏色採用 SGR 參數: 0 = 黑色,1 = 紅色,2 = 綠色,3 =褐色 ,4 = 藍色,5 = 洋紅,6 = 孔雀藍,7 = 白色.

ESC [ 1 ; n ] 設置下劃線顏色爲 n
ESC [ 2 ; n ] 設置暗色爲 n
ESC [ 8 ] 設置當前顏色對爲默認屬性.
ESC [ 9 ; n ] 設置屏幕空白超時爲 n 分鐘.
ESC [ 10 ; n ] 設置機箱喇叭鳴叫頻率,單位: Hz.
ESC [ 11 ; n ] 設置機箱喇叭鳴叫持續時間,單位:微秒.
ESC [ 12 ; n ] 設置指定控制檯前臺運行.
ESC [ 13 ] 設置指定控制檯黑色
ESC [ 14 ; n ] 設置 VESA 關閉間隔,單位: 分鐘.

內核可以完成以下四種字符轉換,使字符能在屏幕上顯示. a)Latin1 -> PC,b)VT100 graphics -> PC,c)PC -> PC, d)user-defined(用戶自定義).

有兩種字符集設置,以 G0 和 G1定義,當前字符集必定是其中之一.(初 始化爲G0.)鍵入 ^N 使 G1 成爲當前字符集,鍵入 ^O 使 G0 成爲當前設置.

變量 G0 and G1 指向字符映射關係表,並且這種指向關係可以由用戶改變. 系統初始化時它們分別指向表 a)and b). 序列 ESC( B ,ESC( 0 ,ESC( U 和 ESC( K 分別使 G0 指向字符映射表 a),b),c)和 d). 序列 ESC )B ,ESC )0 ,ESC )U 和 ESC )K 分別使 G1 指向字符映射表 a),b),c)和 d).

序列 ESC c 重置一個終端,當屏幕顯示出現混亂時可以使用這個序列. 另一個序列 "echo ^V^O" 僅僅將G0設爲當前字符集,但並不保證 G0 指 向映射表 a). 有的Linux發行版中提供一個叫做 reset(1) 的程序用來送出序列 "echo ^[c". 如果你的系統終端變量沒有錯誤( rs1=\Ec), 那麼使用"tput reset"也可以達到同樣效果.

用戶自定義映射表可以用程序 mapscrn(8). 定義.這個程序工作時會將送入的字符c通過關係式s=map[c]映射到 字符s然後送入顯存.字符s所對應的位圖放在字符ROM裏面,可以使 用程序 setfont(8).

來改變.

鼠標軌跡工具可以返回與 xterm 兼容的鼠標狀態報告.因爲控制檯 驅動沒有辦法知道鼠標類型,只有當虛擬終端驅動接收到鼠標輸入 輸出消息更新時纔會將這些報告返回給控制檯輸入流..這些鼠標 輸入輸出消息由 gpm(8) 守護進程產生.

所有鼠標軌跡轉義序列參數由xterm 編碼成象value+040 這樣的單一字符形式的數字參數.比如,`!' 編碼成 1.屏幕座標系統 以'1'爲基準.

X10 兼容模式在鼠標鍵按下時將按下的鍵和鼠標位置編碼後送出. ESC [ ? 9 h 允許這一動作,ESC [ ? 9 l禁止這一動作. 有鍵按下時,xterm 送出ESC [ M bxy(6 個字符).這裏 b 代表 鍵-1,而 xy 是鼠標的 x 和 y 座標.這和 內核產生的序列相同.

常規的軌跡模式(Linux 2.0.24不再支持)在左右兩鍵同時按下然後 釋放時送出轉義序列.組合鍵編碼也被送出.ESC [ ? 1000 h 允許這 個動作而ESC [ 1000 l 禁止這個動作.當有鍵按下或者釋放時, xterm 送出 ESC [ M bxy.b 的低兩位對按鍵信息編碼: 0=鼠標鍵1按下,1=鼠標鍵2 按下,2=鼠標鍵3 按下,3=釋放. 高位編碼代表組合鍵,和上述編碼一起送出: 4=Shift,8=Meta(Alt),16=Control(Ctrl).xy爲發生鼠標事 件的x和y座標.以左上角爲(1,1).

我們已經討論了幾種終端類型,比如Linux 控制檯.這類終端稱爲 "VT100兼容"的終端.這裏我們再介紹其他兩種重要的終端類型: DEC VT102 和 xterm(1) 以及他們和Linux控制終端的區別.

vt102 也使用以下控制序列:

NUL(0x00)忽略;

ENQ(0x05)觸發應答消息;

DC1(0x11,^Q,XON)繼續傳送;

DC3(0x13,^S,XOFF)使 vt100 忽略(並停止傳送) 除 XOFF and XON 以外的一切字符.

VT100-like DC1/DC3 進程可以由 tty 驅動激活.

程序 xterm (在 vt100 模式 中)使用控制序列 BEL,BS,HT,LF,VT,FF,CR,SO,SI,ESC.

VT100 控制檯序列不完全支持Linux控制檯序列:

ESC N SS2 僅僅爲下一個字符選擇 G2 字符集
(Single shift 2).
ESC O SS3 僅僅爲下一個字符選擇 G2 字符集
(Single shift 2).
ESC P DCS 設備控制字符,由ESC \ 終止
(Device control string).
ESC X SOS 字符串開始.
(Start of string)
ESC ^ PM 私有消息,由 ESC \ 終結
(Privacy message)
ESC \ ST 字符串終結
(String terminator)
ESC * ... 指定 G2 字符集
ESC + ... 指定 G3 字符集

程序 xterm (vt100 模式)承認 ESC c,ESC # 8,ESC >,ESC =, ESC D,ESC E,ESC H,ESC M,ESC N,ESC O,ESC P ...ESC ESC Z(以 [ ? 1 ; 2 c,`I am a vt100 with advanced video option'迴應) 以及 ESC ^ ...ESC 意義同上. 接受 ESC(,ESC ),ESC *,ESC + 後跟 0,A,B 的字符序列,分別 代表的DEC 特殊字符,畫線設置,UK 和 US ASCII碼. 接受 ESC ] 作爲特定資源設置:

ESC ] 0 ; txt BEL 將圖標名和窗口標題設爲文本.
ESC ] 1 ; txt BEL 將圖標名設爲文本.
ESC ] 2 ; txt BEL 將窗口名設爲文本.
ESC ] 4 6 ; name BEL 改變日誌文件名(一般
由編譯時選項禁止)
ESC ] 5 0 ; fn BEL 字體設置爲 fn.

以下字符的含義略有不同::

ESC 7 DECSC 存儲光標位置
ESC 8 DECRC 恢復光標位置

它還接受以下序列:

ESC F 光標移動到屏幕左下角(由
hpLowerleftBugCompat 打開這項設置)
ESC l 內存鎖定(對於 HP 終端).
鎖定光標以上的內存.
ESC m 內存解鎖(對於 HP 終端).
ESC n LS2 調用 G2 字符集.
ESC o LS3 調用 G3 字符集.
ESC | LS3R 以GR調用 G3 字符集.
在xterm上看不到效果.
ESC } LS2R 以GR調用 G3 字符集.
在xterm上看不到效果.
ESC ~ LS1R 以GR調用 G3 字符集.
在xterm上看不到效果.

它不識別 ESC % ...

程序 xterm (直到 XFree86 3.1.2G)不能識別閃爍或者不可見模式的 SGR值.X11R6 也不能識別以 SGRs 爲參數設置的色彩. xterm 可以識別其他的 ECMA-48 CSI 序列,只要Linux可以識別. 反之亦然.

xterm 可以識別以上列出的所有 DEC 私有序列,但是不包括 Linux 私有模式序列. 在 Xterm Control Sequences 中有關於 xterm 的私有模式序列的討論.

document by Edward Moy and Stephen Gildea,available with the X distribution.

在版本爲 2.0.23 的內核中,CSI 序列的識別有些問題: 不能識別轉義序列中的NUL.

console(4), console_ioctl(4), charsets(7)

本頁面中文版由中文 man 手冊頁計劃提供。
中文 man 手冊頁計劃:https://github.com/man-pages-zh/manpages-zh
October 31, 1996 Linux