Terminal

如何在終端中使用 256 色作為背景色

  • September 28, 2020

我知道如何在終端中使用 256 色文本:

printf "\033[38;5;196mhello\n"

但是對於背景顏色,我似乎僅限於基本的 8 種顏色,即:

printf "\033[41mhello\n"

如何也使用 256 色作為背景色?

我的意思是,終端已經知道顏色,所以應該是可能的。但是語法是什麼?

如果它是相關的,我將terminator用作我的終端模擬器和zsh我的外殼。

zsh中,您不需要對轉義序列進行硬編碼,因為它具有多種設置背景和前景色的內置方法。

您可以使用echoti setaf終端setnsi aoregroundf顏色並echoti setab設置背景顏色bsetaf並且setab是相應term info 功能的名稱)

假設您的終端支持 256 種顏色(就像基於 VTE 的顏色,例如您的 gnome-terminator 所做的那樣)並且$TERM正確設置為一個值,該值可以辨識具有正確轉義序列的 terminfo 條目,它應該可以工作。

$ echoti setab 196 | sed -n l
\033[48;5;196m$

或者,您可以使用帶有print -P%參數擴展標誌的提示擴展,並且:

$ print -rP '%K{196}' | sed -n l
\033[48;5;196m$

(此處sed -n l用於顯示正在發送的相應轉義序列,$只是顯示行結束的位置,它不是輸出的一部分,是\033GNU命令對 ESC 字元的表示(ASCII 中的八進制 033 字節值) )sed``l

某些終端(包括基於 VTE 的終端,例如您的 gnome-terminator)也支持 RGB 規範。在那些上,你可以做

$ print -rP '%K{#ffffff}' | sed -n l
\033[48;2;255;255;255m$

(這裡fffffff是亮白色,因為這是ff所有紅色、綠色和藍色分量的最大值)。在這種情況下,zsh硬編碼 xterm 樣式的序列(參見那裡的背景),因為沒有相應的 terminfo 功能。雖然不是標準的,但它是目前在現代 FLOSS 終端仿真器中得到最廣泛支持的。

%K設置背景顏色,%F用於前景。%k/%f恢復預設顏色。

對於不支持但支持 88 或 256 調色板的終端,zsh還有一個zsh/nearcolor模組可以讓您獲得最接近該 RGB 規範的顏色:

$ zmodload zsh/nearcolor
$ echoti colors
256
$ print -rP '%K{#ffffff}' | sed -n l
\033[48;5;231m$

(這裡我的 256 色終端上的 231 色是最接近亮白色的,它實際上是亮白色)。

如果您有權訪問 X11rgb.txt文件,您還可以為每個X11 顏色名稱定義關聯數組,例如:

typeset -A X11_bg X11_fg
while read -r r g b c; do
 [[ $r = [0-9]* ]] || continue
 printf -v hex %02x $r $g $b
 X11_fg[$c]=${(%):-%F{#$hex}}
 X11_bg[$c]=${(%):-%K{#$hex}}
done < /etc/X11/rgb.txt
X11_bg[default]=${(%):-%k} X11_fg[default]=${(%):-%f}

(類 Debian 系統/etc/X11/rgb.txt作為x11-common軟體包的一部分)。

執行以下操作:

print -r "$X11_bg[dark olive green]text$X11_bg[default]"

有關更多詳細資訊,請參閱:

  • man 5 terminfo
  • info zsh echoti
  • info zsh print
  • info zsh "Prompt Expansion"
  • info zsh "The zsh/nearcolor Module"

(請注意,在某些系統上,您需要安裝zsh-doc軟體包或等效程序才能使info頁面可用)。

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