zsh:在 tmux 中设置 TERM=screen-256color,但在没有 tmux 的情况下设置 xterm-256color

zsh:在 tmux 中设置 TERM=screen-256color,但在没有 tmux 的情况下设置 xterm-256color

我需要$TERMxterm-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"

相关内容