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


18

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

首先,我尝试了:

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

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

然后,我尝试在自己的评论中删除一行~/.zshrc。现在,当我打开终端时,TERMxterm,当我运行tmux时,TERMscreen-256color。所以看来,如果我将设置TERM.zshrc,则tmux首先设置TERMscreen-256color,运行shell(即zsh),然后zsh读取.zshrc并重置TERMxterm-256color

那么,如何使TERM自己xterm-256color在“普通”终端和screen-256colortmux中?


5
在xterm配置(X资源)中为xterm设置TERM,在tmux配置中为tmux设置TERM。没有理由您应该在zsh中执行任何操作。
斯特凡Chazelas

嗯,但是我还使用其他终端仿真器:例如,gnome-terminal和地震样式的下拉控制台“ altyo” github.com/linvinus/AltYo,仍然找不到TERM在这些终端中设置正确的方法
Dmitry Frank

1
这些应用程序负责正确设置 TERM。对于gnome-terminal,可能应该是gnome-256color...所以是您需要正确配置的那些应用程序,而不是zsh。使用它们的原因xterm可能是为了避免将其切入没有更具体terminfo条目的机器时出现问题。如果您知道仅将其连接到具有详尽的terminfo数据库的计算机,则可以并且应该在应用程序本身中进行更改。
斯特凡Chazelas

而且,如果您需要添加.zshrc kludge IMO,则应在不完整terminfo数据库的计算机上使用(xterm如果不支持xterm-256color,则用不支持xterm-256color的方式替换xterm-256color ,尽管在我们的计算机上添加这些条目甚至会更好。拥有〜/ .terminfo数据库)。
斯特凡Chazelas

我们应该在终端仿真器中设置术语,而不是在中.zshrc。这不是正确的方法。
jdhao

Answers:


24

TERM环境变量应由充当终端的应用程序设置。这就是问题的全部所在:让运行在其中的程序知道正在使用的终端,并因此知道其支持的功能。

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

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

xterm*termName: xterm-256color

看来gnome-terminal确实在读取您的xterm配置,而不是拥有它自己,这是愚蠢的事情。在某些情况下,这可能会帮助您,但应将其更正确地设置为gnome-256color。这似乎是对它(以及其他一些基于VTE的终端仿真器)的长期困扰。解决此问题的一种常见方法是利用它确实设置的另一个值:

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

但这使您重新了解tmux的问题,因此,如果已经是“ screen-256color”或“ screen”之类的东西,则必须不重设TERM来解决这个问题:

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

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


zsh不负责设置$SHELLlogin负责制定它,如果你想告诉应用程序(负责更改到别的东西xtermvi你想为你的首选外壳...)的shell。zsh负责设置$ZSH_VERSION和一些已记录的特殊shell变量,但与无关$SHELL
斯特凡Chazelas

@StéphaneChazelas我很草率,谢谢你的纠正。
Caleb 2014年

感谢这一点,它使我寻找如何konsole设置TERM,而不是将其放在我的bashrc中。在配置文件的“常规”选项卡“环境”中找到它,并将其从更改xtermxterm-256color
Mike Lippert,

值得注意的是,在我的普通deb10下安装GNOME Terminal报告truecolor而不是gnome-terminalfor $COLORTERM,因此上述检测机制可能无法正常工作。XTERM似乎根本没有设置此值,检查任何值可能是有效的。此术语类型可能在其他地方的要点中进行了部分讨论:gist.github.com/XVilka/8346728#true-color-detection
Shaun Wilson

8

在您的.zshrc里面,放

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

而且,在您的.tmux.conf中

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

2
或者 [[ $TMUX != "" ]] && export TERM="screen-256color" 这样,只有在tmux会话中调用zsh时,才设置TERM
Titou
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.