Shell

用於設置深色或淺色終端背景的通用環境變數

  • August 10, 2021

我編寫了許多調試 ,它們都可以為終端會話中顯示的原始碼文本著色。他們都明白有些終端有深色背景,有些有淺色背景,當然顏色需要根據終端方案而有所不同。

當您的終端與預設背景不匹配時,必須設置為其他方案很煩人,所以我想找到一種方法來自動解決這個問題。建議?(他們都支持選項--highlight={light|dark|plain}

一種簡單的機制是關閉環境變數。對於我一直在使用的 shell 配置文件DARK_BACKGROUND_COLOR,但如果已經有某種預設名稱,例如 for PAGEREDITORSHELLHOME等。我想使用它。

有這樣的環境名稱約定嗎?其他建議?

*編輯:*根據接受的答案和討論,我已經從 using 切換DARK_BACKGROUND_COLORCOLORFGBG. 值15;0適用於深色背景(技術上是黑底白字),0;15(技術上是白底黑字)適用於淺色背景。

沒有這樣的約定。此外,環境變數不是報告有關終端資訊的​​好方法,因為如果程序啟動另一個不更新此變數的終端仿真器,或者如果程序連接到多個終端,則該值可能會變得陳舊。

TERM環境變數不會遇到這些問題,因為它是通用的:每個終端仿真器都設置它並且每個程序都知道它。只有在部分支持變數時才會出現問題。)

獲取資訊的正確方法是查詢終端。在 unix 世界中,這是通過編寫一個轉義序列來完成的,終端將其解釋為“發回一些回答我的查詢的數據”。正如Thomas Dickey 解釋的那樣,xterm 有這樣一個控制序列OSC 11 ; ? BEL(設置文本參數,參數 11 = 文本背景顏色,值?表示查詢而不是設置)。寫入\e]11;?\a終端(其中\e是轉義字元 ( ^[) 和\a響鈴字元 ( ^G)),xterm 以類似字元串\e]11;rgb:0000/0000/0000\a(黑色背景)回复。不幸的是,很少有其他終端仿真器支持這種轉義序列。

Rxvt 將環境變數COLORFGBG設置為字元串,例如7;0where7是前景色(7 是淺灰色)和0是背景色(黑色)。Konsole 也支持這一點。

Emacs 嘗試檢測終端的背景是淺色還是深色,以便設置background-mode終端參數。從 Emacs 24.5 開始,有三種方法可以自動設置後台模式:

  • xterm上,Emacs 使用上述OSC 11轉義序列。
  • rxvt上,Emacs 使用COLORFGBG如上所述的環境變數。
  • DOSWindows控制台上,Emacs 使用特定於作業系統的介面來獲取有關終端的資訊;OSC 11這些介面與轉義序列的作用相同。

這遺漏了許多終端,但是有一些進展:為許多終端仿真器(如 gnome-terminal、guake、terminator、xfce4-terminal 等)提供支持的 vte 庫從 0.35.2 版開始OSC 11實現了類似 xterm 的報告。您可以通過檢查環境變數來檢測基於 VTE 的終端;該值是一個數字,你想要 3502 及以上。VTE_VERSION

如果您想標準化向應用程序報告資訊的方式,那麼終端方面的支持可能並不重要:畢竟您知道您喜歡淺色還是深色背景。那麼您不妨與 rxvt 和 use 保持一致COLORFGBG,因為它是某人已經在使用的唯一介面,並且您可以獨立於任何終端支持來採用它。界面是有限的COLORFGBG:它是為一個只有 16 種顏色的世界設計的,每個人都同意從顏色編號到顏色的映射(至少大致上,確切的色調不同)。Konsole 支持超過 16 種顏色,但在報告時使用近似值COLORFGBG:它通過 16 種標準顏色中的一種來近似前景色和背景色。如果您只關心淺色與深色,那不是問題,只需設置COLORFGBG15;0深色背景上的淺色文本或0;15淺色背景上的深色文本。

空無一人。您可以自由制定自己的約定。

一些程序(例如xterm)可以為應用程序提供目前設置的前景色和背景色(參見“動態顏色”)。但除了諸如 之類的應用程序之外xtermcontrol,很少有人使用它。Emacs 查詢目前背景顏色以設置其background-mode終端參數,該參數決定是否應用“深色”或“淺色”版本的顏色主題。另一方面,Vim 可能使用 xterm 控制序列來控制顏色的數量和特殊鍵發送的字元串(請參閱*XTerm 控制序列*中的“請求 Termcap/Terminfo 字元串”),它不會檢測前景/背景的感覺顏色。

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