我需要$TERM
在xterm-256color
tmux 之外(在带有 zsh 的“普通”终端中),但screen-256color
在 tmux 内。
首先我尝试:
- 添加
export TERM='xterm-256color'
到我的~/.zshrc
. - 添加
set -g default-terminal "screen-256color"
到我的~/.tmux.conf
现在,当我打开终端(例如 xterm)时,TERM
是xterm-256color
,这是正确的。但是当我运行 tmux 时,TERM
又是xterm-256color
!
然后我尝试注释掉我的~/.zshrc
.现在,当我打开终端时,TERM
是xterm
,当我运行 tmux 时,TERM
是screen-256color
。所以看来,如果我TERM
在 中设置.zshrc
,tmux 首先设置TERM
为screen-256color
,运行 shell(即 zsh),然后 zsh 读取.zshrc
并重置TERM
为xterm-256color
。
那么,如何才能在“普通”终端和tmux 中TERM
呢?xterm-256color
screen-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"