ncurses轉義序列的破譯
幫助我破譯
ncurses
圖書館創建並被strace
. 我正在探索如何ncurses
與終端互動並想了解它的“握手協議”。我已經找到了一些描述,但並沒有全部理解,比如“將游標鍵設置為游標”。
echo $TERM
列印xterm-256color
。原來的
write(1, "\33[?1049h\33[22;0;0t\33[1;39r\33(B\33[m\33[4l\33[?7h\33[H\33[2J", 46) = 46 write(1, "Hello World !!!", 15) = 15 write(1, "\33[39;1H\33[?1049l\33[23;0;0t\r\33[?1l\33>", 32) = 32
我的假設
write(1, " \33[?1049h # go to alternate screen \33[22;0;0t \33[1;39r \33(B # Set United States G0 character set \33[m # Turn off character attributes \33[4l \33[?7h # Set auto-wrap mode \33[H # Move cursor to upper left corner \33[2J # Clear entire screen ", 46) = 46 write(1, "Hello World !!!", 15) = 15 write(1, " \33[39;1H \33[?1049l # Go back to the initial screen \33[23;0;0t\r \33[?1l # Set cursor key to cursor \33> ", 32) = 32
測試程序源碼
int main() { napms(25000); /* This pause is needed to catch the process by strace*/ initscr(); /* Start curses mode */ printw("Hello World !!!"); /* Print Hello World */ refresh(); /* Print it on to the real screen */ endwin(); /* End curses mode */ return 0; }
對於 XTerm 和任何聲稱與它兼容的東西,你會想要這個:
https://invisible-island.net/xterm/ctlseqs/ctlseqs.html
您還需要 VT100 終端的手冊,XTerm 模擬並擴展了它:
https://vt100.net/docs/vt100-ug/contents.html
Linux
console_codes(4)
手冊頁描述了 Linux 控制台使用的控制程式碼,它也是 VT100 的超集,手冊頁有時比上面的其他來源有更詳細的描述:http://man7.org/linux/man-pages/man4/console_codes.4.html
您範例中的未知程式碼:
\33[22;0;0t
在這裡,第一部分
\33[
(或ESC [
)被稱為CSI
或控制序列介紹器。這
CSI <number> ; <number> ; <number> t
是一個視窗操作序列。以結尾的控制序列t
總是採用三個數字參數,但並不總是使用所有這些參數。第一個參數是22
,第二個參數是0
,所以這段程式碼告訴終端模擬器保存目前的視窗和圖示標題,以便以後可以恢復。\33[1;39r
這是
CSI <number> ; <number> r
. 意思是“設置滾動區域”。將此設置為小於目前視窗大小的內容將有效地保持靜態內容,例如 TUI 顯示頂部的菜單行、底部的狀態行或兩者,同時在滾動區域內顯示大量文本。\33[4l
這是
CSI <one or more numbers> l
. 意思是“重置模式”。值 4 重置(禁用)“插入替換模式”,或者簡單地說,告訴列印到螢幕上的任何內容都應該簡單地覆蓋之前的內容。\33[39;1H
這是
CSI <number> ; <number> H
. 這會將游標移動到第 39 行,第 1 列。\33[23;0;0t
這是另一個視窗操作序列。這將恢復先前保存的視窗和圖示標題。顯然,您的測試程序根本沒有更改標題,但這些序列是由
initscr()
和endwin()
分別完成的標準初始化/退出程序的一部分。\33[?1l # Set cursor key to cursor
這會將 VT100 鍵盤的游標鍵設置為正常的“游標鍵模式”。還有另一種模式,旨在允許這些鍵用於特定於應用程序的目的,例如一組額外的功能鍵。VT100 終端根據模式設置為這些按鍵產生不同的輸出;這只是確保如果應用程序將游標鍵切換到非預設模式,它們將在程序退出之前返回到預設模式。
\33>
這只是
ESC >
。這類似於前面的程式碼,但用於數字鍵盤。