`less` 或 `more` 是否支持 ansi 轉義 `\x1b[2K` (erase_line)?

`less` 或 `more` 是否支持 ansi 轉義 `\x1b[2K` (erase_line)?

基本上我想為我的終端設定動畫,但由於文字太長,我需要一個尋呼機。假設我想定期更改文字顏色。是否可以?

答案1

編輯答案由馮布蘭德托馬斯·迪基技術上更準確。

less-r使用該選項時支援原始 ANSI 轉義。它還支援線上擦除。

但您不會看到任何動畫。例如:

echo -e "foo\x1b[1G\x1b[2Kbar" > test.ansi
less -r test.ansi

只會列印bar.

more預設會傳遞 ANSI 轉義,但不支援我測試過的行編輯。

也可以看看這個 Stackoverflow 回答了和less的差別moremost

答案2

清除該行與更改終端顏色只有間接關係:如果更改背景顏色,那麼許多終端(Linux 控制台、rxvt、xterm 以及模仿其中之一的程式)將使用該顏色為背景的已清除區域著色。

less確實使用了一些清除操作,但沒有\x1b[2K。正在閱讀來源,它使用 termcap 介面使用多種功能。最相關的部分在術語資訊(5)手冊頁:

   clr_bol                   el1    cb   Clear to beginning
                                         of line
   clr_eol                   el     ce   clear to end of line
                                         (P)

即,\x1b[K\x1b[K,分別為el1el。沒有傳統的 termcap 功能el2,並且(除非您告訴使用或選項less僅傳遞文件內容),不會發送.-r-Rless\x1b[2K

的情況也是如此more,例如,如util-linux套件:它僅使用 termcap 中的功能。與 不同lessmore沒有將非列印字元直接傳送到終端的選項。

如果您使用-r-R選項less,您必須記住它是有限的less不知道(或不太在意)那些轉義符的作用。來自手冊頁:

-r或者--raw-control-chars
原因“生的”要顯示的控製字元。預設是使用插入符號顯示控製字元;例如,control-A(八進位 001)顯示為“^A”。 警告:當 -r 使用該選項時,less 不能追蹤螢幕的實際外觀(因為這取決於螢幕對每種類型的控製字元的反應方式)。因此,可能會導致各種顯示問題,例如長線在錯誤的位置被分割。

答案3

對轉義序列做出反應的通常是 tty(除非正在運行的程式將其設定為不遵守它們,在這種情況下程式本身可能會這樣做)。more(1)進行相當原始的螢幕重寫(實際上足以寫出螢幕長度的行,並等待按鍵),所以我猜它只是傳遞輸入。less(1)需要備份,所以需要對螢幕進行更細緻的控制。

相關內容