other languages
| CONSOLE_CODES(4) | Linux Programmer's Manual | CONSOLE_CODES(4) | 
NAME 名稱¶
控制終端代碼 - Linux 控制終端轉義和控制序列DESCRIPTION 描述¶
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 CONSOLE CONTROLS Linux終端控制¶
這一段描述了所有在Linux控制台下使用的調用特殊功能的控制字符 和轉義序列(例如.任何不在當前游標處插入可見字符的序列).Control characters 控制字符¶
當一個字符在通過字符映射表轉換之前含有以下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之間的代碼都被認為是控制字符,而不管是否處於 `顯示控制字符'模式.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- but not CSI-sequences 非控制轉義序列¶
| 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: 重置調色板 | 
ECMA-48 CSI sequence ECMA-48 CSI 序列¶
CSI(或者 ESC [)後面跟的參數序列大部分是NPAR(16), 就是由分號隔開的十進制數.空參數或缺少的參數以0處理. 可以用一個問號代替參數序列.| @ | 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 Set Graphics Rendition 設置圖形屬性¶
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 | 設置預設背景色 | 
ECMA-48 Mode Switches ECMA-48模式選擇¶
- ESC [ 3 h
 - DECCRM(預設關閉): 顯示控制字符.
 
- ESC [ 4 h
 - DECIM(預設關閉): 設置插入模式.
 
- ESC [ 20 h
 - LF/NL(預設關閉): 自動在CR後加上 LF,VT 或者 FF.
 
ECMA-48 狀態報告命令.¶
- ESC [ 5 n
 - 設備狀態報告(DSR): 以 ESC [ 0 n 應答(終端準備好).
 
- ESC [ 6 n
 - 游標位置報告(CPR):
      以ESC [ y ; x R 應答, 這裏
      x,y 指游標位置.
    
 
DEC Private Mode(DECSET/DECRST)sequences DEC私有模式序列.¶
這裏給出的序列在 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)- 見下文.
    
 
Linux Console Private CSI Sequences Linux控制台私有控制序列¶
下面的序列既不屬於 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 關閉間隔,單位: 分鐘. | 
CHARACTER SETS 字符集¶
核心可以完成以下四種字符轉換,使字符能在螢幕上顯示. a)Latin1 -> PC,b)VT100 graphics -> PC,c)PC -> PC, d)user-defined(使用者自定義).a),b),c)和 d). 序列 ESC )B ,ESC )0 ,ESC )U 和 ESC )K 分別使 G1 指向字符映射表 a),b),c)和 d).
MOUSE TRACKING 滑鼠軌跡¶
滑鼠軌跡工具可以返回與 xterm 相容的滑鼠狀態報告.因為控制台 驅動沒有辦法知道滑鼠類型,只有當虛擬終端驅動接收到滑鼠輸入 輸出消息更新時才會將這些報告返回給控制台輸入流..這些滑鼠 輸入輸出消息由 gpm(8) 守護進程產生.和其它終端的比較¶
我們已經討論了幾種終端類型,比如Linux 控制台.這類終端稱為 "VT100相容"的終端.這裏我們再介紹其他兩種重要的終端類型: DEC VT102 和 xterm(1) 以及他們和Linux控制終端的區別.Control-character handling 控制字符處理¶
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.
Escape sequences 轉義序列¶
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 字符集 | 
| 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上看不到效果. | 
CSI Sequences CSI 序列¶
程式 xterm (直到 XFree86 3.1.2G)不能識別閃爍或者不可見模式的 SGR值.X11R6 也不能識別以 SGRs 為參數設置的色彩. xterm 可以識別其他的 ECMA-48 CSI 序列,只要Linux可以識別. 反之亦然.BUGS¶
在版本為 2.0.23 的核心中,CSI 序列的識別有些問題: 不能識別轉義序列中的NUL.參見¶
console(4), console_ioctl(4), charsets(7)| October 31, 1996 | Linux |