Less
[?1049h 和 [?1h ANSI 轉義序列有什麼作用?
當我在一個盒子中使用 shell 並
echo foo | less
在 ajax 響應中呼叫 less 命令 () 時,有以下程式碼:\u001B[?1049h\u001B[?1h\u001B=\rfoo\r\n\u001B[7m(END)\u001B[27m\u001B[K
\u001B[?1049h
和轉義序列做什麼\u001B[?1h
,還有什麼\u001B=
?他們是否記錄在某處?
\u001B
是一個不必要的冗長 ASCII 轉義字元,似乎是為ECMAScript6引入的。POSIX 將使用八進制\033
,而其他一些則允許十六進制\01b
。數字的大小寫無關。(
\u001B[?1049h
and\u001B[?1049l
) 是轉義序列,它告訴xterm可選擇地切換到備用螢幕和從備用螢幕切換。
- 問號表示它是“私人使用”(標準中為特定於實現的功能預留的類別)。XTerm Control Sequences中列出的大約三分之一的私有模式對應於 DEC 中的一個(
DECCKM
在它們的描述中有助記符)。如前所述,其他的要麼是 xterm 的原創,要麼是從其他終端改編而來的。- 這個轉義序列的原因是提供一種基於 terminfo 的方式讓使用者決定程序是否可以使用備用螢幕。根據xterm 手冊:
titeInhibit
(classTiteInhibit
)指定 xterm 是否應該從 TERMCAP 字元串中刪除**
ti
和te
** termcap 條目(用於在啟動許多面向螢幕的程序時在備用螢幕之間切換)。如果設置,xterm 也會忽略轉義序列以切換到備用螢幕。Xterm 以不同的方式支持 terminfo,支持複合控制序列(也稱為私有模式)1047
,**1048
並且與原始控制序列1049
具有相同的效果。47
**此資源的預設值為“false”。1049 程式碼(在1998 年引入)被大多數聲稱與 xterm 兼容的終端仿真器所辨識,但大多數並不使該功能成為可選的。所以他們並沒有真正實現這個功能。
另一方面,
\u001B[?1h
並非源自xterm,而是(如\u001B=
)來自DEC VT100s,用於切換終端以使用游標鍵(DECCKM)和數字鍵盤(DECKPAM)的應用模式。這些由程序使用,例如less
在初始化終端時,因為終端描述使用特殊鍵的應用程序(或正常)模式轉義序列來匹配這些終端描述中給出的初始化字元串。進一步閱讀:
- 為什麼執行vi時螢幕不清晰?(xterm 常見問題解答)
- 為什麼我不能在(無論如何)shell 中使用游標鍵?(xterm 常見問題解答)
- 我的游標鍵不起作用(ncurses 常見問題解答)
- XTerm 控制序列