Terminal

tmux、TERM 和 256 色支持

  • November 23, 2019

介紹

我的問題源於理解為什麼現在(經過多次試驗)終端tmux支持 256 種顏色並tput colors告訴我只有 8 種顏色的必要性。


背景

讓我們從頭開始。

我正在使用Ubuntu盒子、GuaketmuxVim,我喜歡Solarized主題。它們看起來很糟糕,所以我決定啟用 256 色支持並嘗試一下。

讓我們看看我的終端會發生什麼。tput colors說有8種顏色。我個人將它們設置為紫色,在左邊,當然在右邊我們有 2 種不同深淺的藍色。$TERMxterm。(在我的.中有色的ls我。)eval .bashrc

在此處輸入圖像描述

Vim看起來也不錯,儘管我在支持256256 色的環境中使用標誌呼叫它。

set t_Co=256
let g:solarized_termcolors=256
colorscheme solarized

唯一抱怨色彩空間減少的人是tmux。呼叫tmux提供了“錯誤”的預期結果。

在此處輸入圖像描述

tmux但是用旗幟呼叫-2會讓一切正常,神奇地

在此處輸入圖像描述

現在我唯一能理解的是它-2相當於export TERM=screen-256colorsource)。

Guake 的行為類似於Terminal並且他們都回答xterm了這個問題echo $TERM


問題

基本上,有沒有人明白為什麼一切正常,即使它不應該?

  • 我抱怨為什麼事情有效,我是虐待狂嗎?也許。
  • 有更好的理由嗎?當然:我想修復我辦公室中其他 Ubuntu 盒子的外觀,我想了解為什麼這些東西可以正常工作或不正常。

額外的實驗

在 my 上執行此腳本(稍作修改)xterm提供以下結果:256 種顏色,但只有 16 種正確顯示。

在此處輸入圖像描述

然後,改變終端的配置文件,這 16 種顏色也會改變。

在此處輸入圖像描述

更多測試如下。

從左到右,從上到下,我們有Solarized顏色主題,dircolor ansi-dark然後256dark是預設 ( Tango ) 配色方案,dircolor ansi-dark然後是256dark.

在此處輸入圖像描述

觀察:理論上來說dircolor ansi-darkSolarized配色方案應該已經很匹配了dircolor 256dark。對於特定列出的文件,這並沒有明顯發生。相反,當工作目錄中有文件夾文本文件符號連結時,就會發生這種情況。結論256dark:在編碼顏色時沒有給予太多關注。


初步結論

xterm支持 256 種顏色,不管怎麼說tput colors。程序可以參考ansi調色板(可由使用者自定義)或定義它們的顏色,從總共 256 種顏色中挑選。

tmux FAQ中有一些關於 256 色支持的資訊。

不幸的是,由於歷史原因,檢測終端支持的顏色數量並不簡單。有關說明,請參閱檢查我的終端仿真器支持多少種顏色。這意味著

  • tmux 無法可靠判斷終端是否支持超過 8 種顏色;
  • tmux 無法可靠地與應用程序通信它支持超過 8 種顏色。

當您在 tmux 中時,您正在與之互動的終端是 tmux。它不支持所有 xterm 的控制序列。特別是,它不支持OSC 4 ; …查詢或設置顏色值的控制序列。您需要在 tmux 之外的 xterm 中直接執行時使用它。

如果您執行tmux -2,則 tmux 以 256 色支持開始,即使它認為您的終端不支持 256 色(這很常見)。

預設情況下,tmux 宣傳自己screen不支持 256 色。您可以更改 in 的值TERM.tmux.conf指示 256 色支持:

set -g default-terminal "screen-256color"

您可以在 Ubuntu 上使用TERM=xterm-256color或。TERM=screen-256color如果您登錄到沒有這些名稱的 termcap/terminfo 條目的遠端電腦,這些值只會造成麻煩。您可以將條目複製到遠端電腦上的主目錄;這適用於大多數現代 terminfo 實現。

# From the Ubuntu machine to a machine that doesn't have *-256color terminfo entries
ssh somewhere.example.com mkdir -p .terminfo/s .terminfo/x
scp -p /lib/terminfo/s/screen-256color somewhere.example.com:.terminfo/s/
scp -p /lib/terminfo/x/xterm-256color somewhere.example.com:.terminfo/x/

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