DEC ANSI 命令序列問題;游標移動
所以我正在編寫一個終端仿真(我知道,我應該只編譯膩子等)並且正處於通過 vttest 以確保它是正確的階段。我現在以 VT102 為基礎,但會在基礎工作正常時添加以後的終端功能,例如顏色。
命令集主要是 ANSI。DEC 有自己的命令集,但從 1973 年左右開始支持 ANSI 命令。這些 ANSI 標準現在顯然不可用,但 ECMA 等效標準是,我有它們(ECMA-48 似乎最相關)但就我而言沒有回答這個問題可以看到。大多數 ANSI 命令序列以 ESC 開頭。許多命令以此處顯示為 CSI 的命令序列標識符開頭,並在數據中表示為 0x1c 0x5b (ESC
[
),如果可以進行 8 位通信,則為 0xdb。然後按照順序辨識命令。有些命令會影響游標位置,有些會影響螢幕,有些會引起對主機的響應等等。一些終端命令包含一個數字參數。範例
CSI 10 ; 5 H
表示將游標位置設為第 10 行第 5 列。當缺少數字參數時,將使用預設值:CSI 10 ; H
表示將游標位置設為第 10 行第 1 列,因為 1 是未給出參數時的預設值。我有來自 vt100.net 的 vt102 手冊(很好的資源),還有大約十幾頁提供了有關這些命令序列的部分資訊。顯然,完整的福音 DEC 終端規範從未脫離 DEC。
清楚的是
CSI C
向右移動游標,預設值為 1。不清楚的是 是什麼意思
CSI 0 C
。為什麼那裡有一個零,它似乎使命令什麼也不做?如果它的意思是“使用預設值”,那麼它可以作為 1 發送,但較短的字元串將沒有參數,並且無論如何都依賴於預設值被解釋為 1。這些實際的物理 VT 終端通常在 300 波特及以下使用,所以一個字元確實很重要!
我對 vttest 並沒有那麼先進,我可以兩種方式都試一下,看看哪一種能讓一切變得完美,但我已經足夠遠了,像這樣的小問題開始變得重要了。
我與維護 xterm 和 vttest 的 Thomas Dickey (invisible-island.net) 取得了聯繫——他解釋說這與xterm
CSI 0 C
相同。CSI 1 C``CSI C
對於尋找更多終端程式資訊的人,我強烈建議查看他託管的 xterm 原始碼——特別是 xterm 中的 ctlseqs.txt,它看起來非常像我一直在尋找的一個真正的終端控制序列參考。
當您已經擁有將功能映射到許多不同終端的特定程式碼序列的數據庫時,為什麼還要對特定終端類型進行硬編碼兼容性?(terminfo 數據庫通常位於 /usr/share 中,並且包含在大多數 ncurses 發行版中)。任何關於 curses 的資源都應該解釋這些函式的標記方式。
請注意,terminfo 文件通常是編譯的(使用 tic),因此您可能需要深入探勘才能找到 terminfo 源文件。
另請參閱http://tldp.org/HOWTO/Text-Terminal-HOWTO.html#toc16(他們的一個連結到 terminfo.src 文件的一個儲存庫)