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

18

Мне нужно, $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-256colorв tmux?

Дмитрий Франк
источник
5
Установите TERM для xterm в конфигурации xterm (ресурсы X) и для tmux в конфигурации tmux. Нет причин, по которым вы должны делать что-либо в zsh.
Стефан Шазелас
Хм, но я также использую другие эмуляторы терминала: скажем, gnome-терминал и раскрывающуюся консоль в стиле quake "altyo" github.com/linvinus/AltYo , до сих пор не могу найти способ установить правильные значения TERMв этих терминалах
Дмитрий Франк
1
Ну, эти приложения несут ответственность за правильную настройку своего СРОКА. Ибо это gnome-terminal, вероятно, должно быть gnome-256color... Так что это те приложения, которые вы должны правильно настроить, а не zsh. Причина, по которой они используют xtermэто, вероятно, состоит в том, чтобы избежать проблем при подключении к компьютерам, на которых нет более конкретных записей terminfo. Если вы знаете, что используете только компьютеры с исчерпывающей базой данных terminfo, вы можете и должны изменить это в самих приложениях.
Стефан Шазелас
И если вам нужно добавить .zshrc kludge, IMO, это должно быть на машинах, которые имеют неполные базы данных terminfo (заменить xterm-256color на xtermесли xterm-256color s не поддерживается, хотя было бы еще лучше добавить эти записи в наш собственная ~ / .terminfo база данных).
Стефан Шазелас
Мы должны установить термин в эмуляторе терминала, а не в .zshrc. Это не правильный путь.
jdhao

Ответы:

24

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

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

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

xterm*termName: xterm-256color

Похоже, что gnome-Terminal делает идиотскую вещь, читая, что будет с вашей конфигурацией xterm, вместо того, чтобы иметь свою собственную. Это может помочь вам в некоторых случаях, но правильнее установить gnome-256color. Похоже, это давнишняя схватка (и некоторые другие эмуляторы терминалов на основе VTE). Распространенный способ взломать вокруг этого использовать другое значение , он установлен:

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

Но это возвращает вас к проблеме с tmux, поэтому вам придется учитывать это, не сбрасывая TERM, если это уже что-то вроде «screen-256color» или «screen»:

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

Для других терминалов вам нужно будет найти их правильные процедуры конфигурации.

Калеб
источник
zshне несет ответственности за настройку $SHELL. loginотвечает за его настройку, и вы несете ответственность за то, чтобы изменить это на что-то другое, если вы хотите сообщить приложениям ( xterm, vi...), какую оболочку вы хотите использовать в качестве предпочитаемой. zshотвечает за установку $ZSH_VERSIONи несколько задокументированных специальных переменных оболочки, но это не трогает $SHELL.
Стефан Шазелас
@ StéphaneChazelas Это было небрежно с моей стороны, спасибо за исправление.
Калеб
Спасибо за это, это заставило меня искать, как konsoleустановить TERM, а не помещать его в мой bashrc. Нашел его на вкладке «Общие» профиля «Среда» и изменил его xtermнаxterm-256color
Майк Липперт,
Стоит отметить, что под моим vanilla deb10 установите отчеты терминала GNOME truecolorвместо gnome-terminalfor $COLORTERMи поэтому вышеописанный механизм обнаружения может не работать. XTERM, по-видимому, вообще не устанавливает это значение, может быть допустимо проверить любое значение. этот тип термина частично обсуждается в этой сущности, возможно, в другом месте: gist.github.com/XVilka/8346728#true-color-detection
Шон Уилсон,
8

Внутри вашего .zshrc положите

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

И внутри вашего .tmux.conf

set -g default-terminal "screen-256color"
thiagowfx
источник
2
Или, [[ $TMUX != "" ]] && export TERM="screen-256color" таким образом, zsh установит TERM, только если вызывается в сеансе tmux
Titou