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, працює оболонка (яка ЗШ), і ЗШ читає .zshrcі скидає TERMз xterm-256color.

Отже, як зробити так, TERMщоб бути і xterm-256colorв "звичайному" терміналі, і screen-256colorв tmux?


5
Встановіть TERM для xterm у конфігурації xterm (ресурси X) та для tmux у конфігурації tmux. Немає причини робити щось із цього в zsh.
Stéphane Chazelas

Хм, але я також використовую інші емулятори терміналів: скажімо, спадна консоль "altyo" githome.com/linvinus/AltYo , gnome-terminal та епілятори в стилі землетрусу , все ще не може знайти спосіб встановити правильність TERMу цих терміналах
Дмитро Франк

1
Ну ці додатки відповідають встановити їх TERM правильно. Бо це gnome-terminal, мабуть, повинно бути gnome-256color... Отже, це ті програми, які потрібно правильно налаштувати, а не zsh. Причина, якою вони користуються, xterm- це, ймовірно, щоб уникнути проблем під час передачі даних на машини, які не мають більш конкретних записів терміна. Якщо ви знаєте, що ви працюєте лише на машинах із вичерпною базою даних terminfo, ви можете та повинні змінити це в самих програмах.
Стефан Шазелас

І якщо вам потрібно додати .zshrc kludge, IMO, це має бути на машинах, які мають неповні бази даних terminfo (замінити xterm-256color на, xtermякщо xterm-256color s не підтримується, хоча було б ще краще додати ці записи в наші власна база даних ~ / .terminfo).
Стефан Шазелас

Ми повинні встановити термін в емуляторі терміналу, а не в .zshrc. Це не правильний шлях.
jdhao

Відповіді:


24

Змінна середовища TERM повинна встановлюватися додатком, який виконує функції вашого терміналу. У цьому і полягає вся справа в тому, щоб дозволити програмам, що працюють всередині них, знати, який термінал використовується, а отже, і які функції він підтримує.

Zsh не є терміналом. Це оболонка. Це може не хвилювати, для чого встановлений ваш термін, якщо він хоче робити спеціальні речі, але він не повинен нести відповідальність за його встановлення . Натомість він несе відповідальність за встановлення змінних, таких як 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, тому вам доведеться враховувати це, не скидаючи термін, якщо це вже щось на зразок "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встановити термін, а не вводити його в мій bashrc. Знайшов його на вкладці "Загальне" профілю, "Навколишнє середовище", змінив його xtermнаxterm-256color
Майк Ліпперт

Варто зазначити, що під моїм ванільним deb10 встановіть звіти GNOME Terminal truecolorзамість gnome-terminalдля, $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"

2
Або [[ $TMUX != "" ]] && export TERM="screen-256color" таким чином zsh встановить TERM, лише якщо він буде викликаний протягом tmux сесії
Titou
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.