用於設置深色或淺色終端背景的通用環境變數
我編寫了許多調試 器,它們都可以為終端會話中顯示的原始碼文本著色。他們都明白有些終端有深色背景,有些有淺色背景,當然顏色需要根據終端方案而有所不同。
當您的終端與預設背景不匹配時,必須設置為其他方案很煩人,所以我想找到一種方法來自動解決這個問題。建議?(他們都支持選項
--highlight={light|dark|plain}
)一種簡單的機制是關閉環境變數。對於我一直在使用的 shell 配置文件
DARK_BACKGROUND_COLOR
,但如果已經有某種預設名稱,例如 forPAGER
、EDITOR
、SHELL
、HOME
等。我想使用它。有這樣的環境名稱約定嗎?其他建議?
*編輯:*根據接受的答案和討論,我已經從 using 切換
DARK_BACKGROUND_COLOR
到COLORFGBG
. 值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;0
where7
是前景色(7 是淺灰色)和0
是背景色(黑色)。Konsole 也支持這一點。Emacs 嘗試檢測終端的背景是淺色還是深色,以便設置
background-mode
終端參數。從 Emacs 24.5 開始,有三種方法可以自動設置後台模式:
- 在xterm上,Emacs 使用上述
OSC 11
轉義序列。- 在rxvt上,Emacs 使用
COLORFGBG
如上所述的環境變數。- 在DOS和Windows控制台上,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 種標準顏色中的一種來近似前景色和背景色。如果您只關心淺色與深色,那不是問題,只需設置COLORFGBG
為15;0
深色背景上的淺色文本或0;15
淺色背景上的深色文本。
空無一人。您可以自由制定自己的約定。
一些程序(例如
xterm
)可以為應用程序提供目前設置的前景色和背景色(參見“動態顏色”)。但除了諸如 之類的應用程序之外xtermcontrol
,很少有人使用它。Emacs 查詢目前背景顏色以設置其background-mode
終端參數,該參數決定是否應用“深色”或“淺色”版本的顏色主題。另一方面,Vim 可能使用 xterm 控制序列來控制顏色的數量和特殊鍵發送的字元串(請參閱*XTerm 控制序列*中的“請求 Termcap/Terminfo 字元串”),它不會檢測前景/背景的感覺顏色。