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

Dmi*_*ank 22 zsh tmux xterm

我需要我的$TERMxterm-256colorTMUX以外(在“普通”与zsh的终端),但screen-256color里面TMUX。

首先我试过:

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

现在,当我打开终端(比如 xterm)时,TERMxterm-256color,这是正确的。但是当我运行 tmux 时,又TERMxterm-256color

然后我尝试在我的~/.zshrc. 现在,当我打开终端时,TERMxterm,而当我运行 tmux 时,TERMscreen-256color。如此看来,如果我设置TERM.zshrc,首先TMUX套TERMscreen-256color,运行外壳(这是zsh的),和zsh的读取.zshrc和复位TERMxterm-256color

那么,如何让TERMxterm-256color在“普通”终端,并screen-256color在TMUX?

Cal*_*leb 27

TERM 环境变量应由充当终端的应用程序设置。这就是事情的重点:让在其中运行的程序知道正在使用什么终端,从而知道它支持什么样的功能。

Zsh 不是终端。它是一个壳。如果它想做特殊的事情,它可能会关心您的 TERM 设置为什么,但它不应该负责设置它。相反,它负责设置诸如 ZSH_VERSION 之类的变量,脚本或其他子进程可以使用这些变量来了解其父 shell 所期望的行为。

相反,您需要检查您正在使用的任何终端应用程序的配置,并要求它正确报告自己。例如,您可以通过将此行添加到~/.Xdefaults用于配置值的文件来为 xterm 执行此操作:

xterm*termName: xterm-256color
Run Code Online (Sandbox Code Playgroud)

看起来 gnome-terminal 做了一件愚蠢的事情,那就是阅读你的 xterm 配置而不是拥有它自己的配置。在某些情况下,这可能会让您满意,但更应该将其设置为 vte-256color。这似乎是对它(以及其他一些基于 VTE 的终端仿真器)的长期抱怨。一个常见的方法来破解的解决办法是利用它并设置其他值:

if [ "$COLORTERM" = "gnome-terminal" ]; then
    export TERM=vte-256color
fi 
Run Code Online (Sandbox Code Playgroud)

但这又使您回到了 tmux 的问题,因此,如果 TERM 已经是“screen-256color”或“screen”之类的内容,则必须通过不重置 TERM 来解决这个问题:

if [ "$COLORTERM" = "gnome-terminal" -a "$TERM" =~ xterm.* ]; then
    export TERM=vte-256color
fi
Run Code Online (Sandbox Code Playgroud)

对于其他终端,您将需要查找其正确的配置例程。

  • `zsh` 不负责设置 `$SHELL`。`login` 负责设置它,如果您想告诉应用程序(`xterm`、`vi`...)您想要哪个 shell 作为您的首选 shell,则您有责任将其更改为其他内容。`zsh` 负责设置 `$ZSH_VERSION` 和一些记录的特殊 shell 变量,但它不触及 `$SHELL`。 (2认同)

thi*_*wfx 10

在您的 .zshrc 中,放入

[[ -n $TMUX ]] && export TERM="xterm-256color"
Run Code Online (Sandbox Code Playgroud)

而且,在你的 .tmux.conf 里面

set -g default-terminal "screen-256color"
Run Code Online (Sandbox Code Playgroud)

  • 或者 `[[ $TMUX != "" ]] && export TERM="screen-256color"` 这样 zsh 只会在 tmux 会话中调用时设置 TERM (3认同)