Terminal

ncurses轉義序列的破譯

  • May 4, 2020

幫助我破譯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

Linuxconsole_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 >。這類似於前面的程式碼,但用於數字鍵盤。

引用自:https://unix.stackexchange.com/questions/584416