zsh:在 tmux 中設定 TERM=screen-256color,但在沒有 tmux 的情況下設定 xterm-256color

zsh:在 tmux 中設定 TERM=screen-256color,但在沒有 tmux 的情況下設定 xterm-256color

我需要$TERM位於xterm-256colortmux 之外(在帶有 zsh 的“普通”終端中),但screen-256color在 tmux 內。

首先我嘗試:

  • 添加export TERM='xterm-256color'到我的~/.zshrc.
  • 添加set -g default-terminal "screen-256color"到我的~/.tmux.conf

現在,當我打開終端(例如 xterm)時,TERMxterm-256color,這是正確的。但是當我運行 tmux 時,TERM又是xterm-256color

然後我嘗試註解掉我的~/.zshrc.現在,當我打開終端時,TERMxterm,當我運行 tmux 時,TERMscreen-256color。所以看來,如果我TERM在 中設置.zshrc,tmux 首先設置TERMscreen-256color,運行 shell(即 zsh),然後 zsh 讀取.zshrc並重置TERMxterm-256color

那麼,如何才能在「普通」終端機和tmux 中TERM呢?xterm-256colorscreen-256color

答案1

TERM 環境變數應由充當終端的應用程式設定。這就是事情的全部要點:讓在其中運行的程式知道正在使用什麼終端,從而知道它支援什麼類型的功能。

Zsh 不是終端機。它是一個外殼。如果它想做特殊的事情,它可能會關心你的 TERM 設定為什麼,但它不應該負責環境它。相反,它負責設定 ZSH_VERSION 等變量,腳本或其他子進程可以使用這些變量來了解其父 shell 期望的行為。

相反,您需要檢查您正在使用的任何終端應用程式的配置,並要求它正確報告自身。例如,您可以透過將此行新增至~/.Xdefaults用於設定值的檔案來為 xterm 執行此操作:

xterm*termName: xterm-256color

看起來 gnome-terminal 做了一件愚蠢的事情:讀取你的 xterm 配置,而不是擁有它自己的配置。在某些情況下,這可能會幫助您,但應該更正確地設定為 vte-256color。這似乎是對其(以及其他一些基於 VTE 的終端模擬器)的長期抱怨。 A一般的方法解決這個問題是利用它設定的另一個值:

if [ "$COLORTERM" = "gnome-terminal" ]; then
    export TERM=vte-256color
fi 

但這會讓你回到 tmux 的問題,所以如果它已經是「screen-256color」或「screen」之類的東西,你必須透過不重置 TERM 來解決這個問題:

if [ "$COLORTERM" = "gnome-terminal" -a "$TERM" =~ xterm.* ]; then
    export TERM=vte-256color
fi

對於其他終端,您將需要尋找其正確的設定例程。

答案2

在你的 .zshrc 中,放入

[[ -n $TMUX ]] && export TERM="xterm-256color"

並且,在你的 .tmux.conf 中

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

相關內容