zsh: tmux では TERM=screen-256color を設定しますが、tmux なしでは xterm-256color になります

zsh: tmux では TERM=screen-256color を設定しますが、tmux なしでは xterm-256color になります

を tmux の外側 (zsh を使用した「プレーン」ターミナル内) かつtmux の内側に$TERM配置する必要があります。xterm-256colorscreen-256color

まず最初に試したのは:

  • 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なります。つまり、で を設定すると、tmux は最初に に設定し、シェル (zsh) を実行し、zsh が を読み取って にリセットするようscreen-256colorです。TERM.zshrcTERMscreen-256color.zshrcTERMxterm-256color

では、「プレーン」ターミナルとtmux でどのようTERMにすればいいのでしょうか?xterm-256colorscreen-256color

答え1

TERM 環境変数は、端末として動作しているアプリケーションによって設定する必要があります。これが、内部で実行されているプログラムに、使用されている端末と、それがサポートする機能の種類を知らせるという重要な点です。

Zshはターミナルではありません。シェルです。特別なことをしたい場合、TERMが何に設定されているかは気にするかもしれませんが、設定代わりに、スクリプトや他の子プロセスが親シェルからどのような動作を期待するかを理解するために使用できる ZSH_VERSION などの変数を設定する役割を担います。

代わりに、使用しているターミナル アプリケーションの設定を確認し、適切にレポートするように要求する必要があります。たとえば、xterm の場合は、~/.Xdefaults設定値に使用するファイルに次の行を追加することでこれを実行できます。

xterm*termName: xterm-256color

どうやら gnome-terminal は、独自の設定を行う代わりに、xterm の設定を読み込むという愚かなことをしているようです。これでうまく行く場合もありますが、vte-256color に設定する方が適切です。これは、gnome-terminal (および他の VTE ベースのターミナル エミュレータ) に対する長年の不満のようです。一般的な方法これを回避するには、設定されている別の値を悪用します。

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

しかし、これは tmux の問題に戻るので、TERM がすでに「screen-256color」や「screen」のようなものである場合は、それをリセットしないことでそれを考慮する必要があります。

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"

関連情報