Terminal

MacOS 上 Terminal.app 中的 Tmux 和暗淡顏色

  • July 17, 2016

問題

在我的 Mac (10.11)上, Tmux不能dim正確顯示 -ed 顏色,這會引起煩惱。

在下圖中,送出作者的姓名應該用dim white. 這在Terminal.app中可以正常工作,但在Tmux中不行。

git lg1 比較

有沒有人知道如何調試這個?

我相信它與$TERM變數有關,但我不知道從哪裡開始。

Terminal.app $TERM中設置為xterm-256color.

Tmux $TERM中設置為screen-256color.

在我的.tmux.conf我有set -g default-terminal "screen-256color". xterm-256color,在Tmux中,以某種方式與**Vim的背景顏色發生衝突,但不會改變dim行為。

更多資訊

我在Tmux的 GitHub 儲存庫上打開了一個問題;已經提供了答案,但我並不完全理解。

看起來Terminal.app沒有dim指令,儘管它處理得很好。

Tmux無法獲取dim資訊,因為它不存在,因此無法正確顯示字型。

現在我不確定為什麼一個有效而另一個無效。

輕鬆修復

將以下程式碼添加到~/.tmux.conf.

set -sa terminal-overrides ",*:dim=\\E[2m"

解釋暫定

Application.app似乎沒有dim指令(見第 24 條)。

Terminal 0: xterm-256color [references=1, flags=0x1]:
  1: acsc: (string) ``aaffggiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~
  0: AX: (flag) true
  2: bel: (string) \007
...
 23: dch1: (string) \033[P
 24: dim: [missing]
 25: dl: (string) \033[%p1%dM

這是在Tmuxtmux showmsgs -T中執行的命令的輸出。

另一方面,Terminal.appdim無論如何都會“發送” (不知道如何為什麼),因為它正在工作,如上圖所示。

添加缺少的dim指令(神奇地)解決了這個問題。

tmux(如 GNU 螢幕)通過將實際終端的功能轉換為(通常不同的)內部終端來工作。他們這樣做是為了讓您同時在不同時間連接不同終端上的會話。

如果效果很好,無論您從哪裡連接,您都會看到“相同”的文本。

並非所有終端都支持**dim. 事實上,大多數都沒有。終端數據庫有 121 次出現dim**與 1514 次終端描述。

screen它在 1990 年左右開始時,它的開發人員選擇忽略該功能,而是提供最有用的功能。他們設計的程序為每個行/列單元格儲存termcap程序可能使用的影片屬性。原始碼定義了這些:

#define ATTR_DI         0       /* Dim mode */
#define ATTR_US         1       /* Underscore mode */
#define ATTR_BD         2       /* Bold mode */
#define ATTR_RV         3       /* Reverse mode */
#define ATTR_SO         4       /* Standout mode */
#define ATTR_BL         5       /* Blinking */

但只有在外部screen終端支持它們並且在內部終端描述中提供時才tmux使用這些內部功能。

OSX 捆綁了一份ncurses終端數據庫。雖然您可以安裝 MacPorts 或自製軟體並獲得更高版本,但 OSX擁有的是**ncurses 5.7.20081102**. 如果您使用infocmp顯示終端描述,您會看到如下內容:

$ infocmp screen-256color
#       Reconstructed via infocmp from file: /usr/share/terminfo/73/screen-256color
screen-256color|GNU Screen with 256 colors,
       am, km, mir, msgr, xenl,
       colors#256, cols#80, it#8, lines#24, ncv#3, pairs#32767,
       acsc=++\,\,--..00``aaffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~,
       bel=^G, blink=\E[5m, bold=\E[1m, cbt=\E[Z, civis=\E[?25l,
       clear=\E[H\E[J, cnorm=\E[34h\E[?25h, cr=^M,
       csr=\E[%i%p1%d;%p2%dr, cub=\E[%p1%dD, cub1=^H,
       cud=\E[%p1%dB, cud1=^J, cuf=\E[%p1%dC, cuf1=\E[C,
       cup=\E[%i%p1%d;%p2%dH, cuu=\E[%p1%dA, cuu1=\EM,
       cvvis=\E[34l, dch=\E[%p1%dP, dch1=\E[P, dl=\E[%p1%dM,
       dl1=\E[M, ed=\E[J, el=\E[K, el1=\E[1K, enacs=\E(B\E)0,
       flash=\Eg, home=\E[H, ht=^I, hts=\EH, ich=\E[%p1%d@,
       il=\E[%p1%dL, il1=\E[L, ind=^J, initc@, is2=\E)0, kbs=^H,
       kcbt=\E[Z, kcub1=\EOD, kcud1=\EOB, kcuf1=\EOC, kcuu1=\EOA,
       kdch1=\E[3~, kend=\E[4~, kf1=\EOP, kf10=\E[21~,
       kf11=\E[23~, kf12=\E[24~, kf2=\EOQ, kf3=\EOR, kf4=\EOS,
       kf5=\E[15~, kf6=\E[17~, kf7=\E[18~, kf8=\E[19~, kf9=\E[20~,
       khome=\E[1~, kich1=\E[2~, kmous=\E[M, knp=\E[6~, kpp=\E[5~,
       nel=\EE, op=\E[39;49m, rc=\E8, rev=\E[7m, ri=\EM, rmacs=^O,
       rmcup=\E[?1049l, rmir=\E[4l, rmkx=\E[?1l\E>, rmso=\E[23m,
       rmul=\E[24m, rs2=\Ec\E[?1000l\E[?25h, sc=\E7,
       setab=\E[%?%p1%{8}%<%t4%p1%d%e%p1%{16}%<%t10%p1%{8}%-%d%e48;5;%p1%d%;m,
       setaf=\E[%?%p1%{8}%<%t3%p1%d%e%p1%{16}%<%t9%p1%{8}%-%d%e38;5;%p1%d%;m,
       sgr=\E[0%?%p6%t;1%;%?%p1%t;3%;%?%p2%t;4%;%?%p3%t;7%;%?%p4%t;5%;m%?%p9%t\016%e\017%;,
       sgr0=\E[m\017, smacs=^N, smcup=\E[?1049h, smir=\E[4h,
       smkx=\E[?1h\E=, smso=\E[3m, smul=\E[4m, tbc=\E[3g,

那裡沒有**dim**。在 ncurses 中,這是在 2015 年4 月添加的:

# 2015-04-22
#       + add 'dim' capability to screen entry (report by Leonardo B Schenkel)
#       + add several key definitions to nsterm-bce to match preconfigured
#         keys, e.g., with OSX 10.9 and 10.10 (report by Leonardo B Schenkel)

同樣,您不會**dim**在 xterm-256color 中看到。這是在 2014 年6 月添加的:

# 2014-06-14
#       + modify sgr for screen.xterm-new to support dim capability -TD
#       + add dim capability to nsterm+7 -TD
#       + cancel dim capability for iterm -TD
#       + add dim, invis capabilities to vte-2012 -TD
#       + add sitm/ritm to konsole-base and mlterm3 -TD

**dim未指明在外部 Terminal.app 中使用的方式,但可能是硬編碼的(不使用終端描述)。但是screentmux知道轉義序列是如何進來的,但知道dim**終端描述中沒有提到,因此不支持。

您可以使用和實用程序更新您的 terminfo 數據庫以將該dim功能添加到這些終端描述中:infocmp``tic

  • 用於infocmp獲取 和 的現有終端xterm-256color描述screen-256color。這只是第一個;您當然會重複第二個描述的過程:

infocmp -1x xterm-256color > foo

  • 編輯創建的文本文件infocmp,添加這一行
dim=\E[2m,

並用此行替換sgr=該行:

sgr=%?%p9%t\E(0%e\E(B%;\E[0%?%p6%t;1%;%?%p5%t;2%;%?%p2%t;4%;%?%p1%p3%|%t;7%;%?%p4%t;5%;%?%p7%t;8%;m,
  • 用於tic替換終端描述:

sudo tic -x foo

**注意:問題的重點是問為什麼會發生這種情況;Nicholas Marriott 提供了有關如何解決該問題的資訊。

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