zsh: установите TERM=screen-256color в tmux, но xterm-256color без tmux

zsh: установите TERM=screen-256color в tmux, но xterm-256color без tmux

Мне нужно, $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, запускает оболочку (которая является zsh), а zsh считывает .zshrcи сбрасывает TERMзначение xterm-256color.

Итак, как сделать TERMтак, чтобы был xterm-256colorи "обычный" терминал, и screen-256colortmux?

решение1

Переменная окружения TERM должна быть установлена ​​приложением, которое действует как ваш терминал. В этом и заключается вся суть: дать программам, работающим внутри них, знать, какой терминал используется и, следовательно, какие функции он поддерживает.

Zsh — это не терминал. Это оболочка. Она может заботиться о том, какой у вас TERM, если она хочет делать что-то особенное, но она не должна отвечать запараметрВместо этого он отвечает за установку переменных, таких как ZSH_VERSION, которые могут использоваться скриптами или другими дочерними процессами, чтобы понять, какое поведение ожидать от родительской оболочки.

Вместо этого вам нужно проверить конфигурацию для любого терминального приложения, которое вы используете, и попросить его сообщить о себе должным образом. Например, вы можете сделать это для xterm, добавив эту строку в файл, ~/.Xdefaultsкоторый он использует для значений конфигурации:

xterm*termName: xterm-256color

Похоже, gnome-terminal делает идиотскую вещь, считывая конфигурацию вашего xterm вместо того, чтобы иметь свою собственную. Это может помочь в некоторых случаях, но правильнее было бы установить vte-256color. Похоже, это давняя претензия к нему (и к некоторым другим эмуляторам терминала на основе 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"

Связанный контент