在終端中設置、備份和恢復顏色
我使用這個程序來顯示終端中所有可用的顏色。我得到的就是:
- 這個程序不顯示低於 100 的顏色。為什麼?有沒有辦法顯示它們。
- 是否可以更改某些 #rrggbb 值的第 n 個顏色?或者這是預定義的顏色?
- 如果我可以改變顏色(見問題 2),有沒有辦法導出和導入這些值?
支持多少種顏色以及如何更改前景色和背景色取決於終端。
該
terminfo
數據庫通常可以幫助您提出正確的序列。大多數顏色終端支持 ANSI 顏色轉義序列以將前景色和背景色更改為 0 到 7。
那是:
- 設置前景色*$n*:
printf "\33[3${n}m"
- 設置背景顏色*$n*:
printf "\33[4${n}m"
一些(罕見的)終端(如
emu
)對這些 ANSI 顏色使用不同的序列。一些(罕見的)終端,如 QNX 控制台,具有不同的轉義序列和不同的顏色。
一些(罕見)使用顏色對。您為背景和前景定義了一個顏色對,然後有一個轉義序列來選擇您要使用的顏色對。
現在,xterm 和大多數現代自由軟體終端仿真器將基本的 8 種 ANSI 顏色擴展到多達 16 種(其中 8 到 15 是 ANSI 顏色 0 到 7 的更亮版本)、88 或 256 種顏色。
有些終端
rxvt
只支持 8 種顏色,但如果粗體也打開(用於前景)或閃爍(用於背景),則使用較亮的顏色。\033[34;1m
會給出比 更亮的藍色\033[34m
。使用顏色最便攜的方法是使用 terminfo 數據庫。
它可以通過
tput
命令。tcsh
並且zsh
還有一個echoti
內置的。如果 terminfo 數據庫是正確的,並且值
$TERM
正確反映了您正在使用的終端:tput colors
將為您提供終端支持的顏色數量。
如今,除了上面提到的極少數例外,您可以假設您的終端將支持 ANSI 顏色。ANSI 背景和前景色的 terminfo 功能是
setab
和setaf
。如果終端支持超過 8 種顏色,您仍然可以使用該功能來查詢它們。tput setaf 233
如果終端支持 256 色,則應為該顏色 233 輸出正確的轉義序列。
對於
xterm
,顏色 0 到 7、顏色 8 到 15 和顏色 16 到 255 的setaf
輸出。\033[30m..\033[37m``\033[90m..\033[97m``\033[38;5;16m..\033[38;5;255m
\033[38;5;0m..\033[38;5;15m
也可以工作,但比顏色 0 到 15 的更便攜的等價物長 4 個字節。因此,要測試終端支持的所有顏色。如果它支持 ansi 顏色:
i=0; n=$(tput colors); while [ "$i" -lt "$n" ]; do tput setaf "$i"; printf %04d "$i" i=$((i + 1)) done
如果它支持其他顏色:
i=0; n=$(tput colors); while [ "$i" -lt "$n" ]; do tput setf "$i"; printf %04d "$i" i=$((i + 1)) done
如果它適用於顏色對(如 hpterm-color):
i=0; n=$(tput pairs); while [ "$i" -lt "$n" ]; do tput scp "$i"; printf %04d "$i" i=$((i + 1)) done
現在,要重新定義顏色或顏色對,這在終端之間也會有所不同。
有一個
initc
terminfo 功能可以為那些可以做到這一點的終端重新定義給定的顏色。並initp
重新定義一對。例如將顏色 1 重新定義為亮白色:
tput initc 1 1000 1000 1000
使用
xterm
, 發送序列:\033]4;1;rgb:FF/FF/FF\033\
.要在使用對的終端上將顏色對 1 重新定義為黑底白字:
tput initp 1 1000 1000 1000 0 0 0