У меня есть куча dotfiles, которые позволяют мне иметь симпатичную тему на моем терминале и tmux на моем локальном хосте. Я использую kitty, fish и tmux. Чтобы правильно определить цвета и иметь глобальную согласованность, я использую следующие файлы:
- .Xресурсы
- китти.conf
- fish_prompt.рыба
- .tmux.conf
На моем локальном хосте все выглядит действительно чисто:
У меня также есть удаленный сервер, который запускает тот же arch + fish + tmux и использует точно такие же dotfiles. Однако при подключении к серверу по SSH все выглядит совершенно иначе:
Я поискал в Google и нашел множество руководств, в которых говорится, что нужно добавить кучу странных конфигураций, но ни одно из них на самом деле не объясняет, что на самом деле происходит под капотом (и, как вы можете видеть, ни одно из них не работает).
Вот что я попытался сделать, чтобы это заработало (не совсем понимая, зачем):
- Добавлено в tmux.conf:
set^[[3m -g default-terminal "xterm-kitty"
set-option^[[3m -ga terminal-overrides ",xterm-kitty*:Tc"
- Добавлен файл xterm-kitty terminfo
- Измените
TERM
переменную env на xterm-kitty при входе в систему.
Я бы хотел получить некоторые ресурсы, указывающие на то, как все это работает! Спасибо!
Редактировать :
Для ясности приведу значения, которые TERM
у меня есть:
- На локальном хосте:
xterm-kitty
- На локальном хосте внутри tmux:
xterm-256color
- На удаленном хосте сразу после открытия ssh:
xterm-kitty
- На удаленном хосте в tmux:
xterm-256color
Все файлы синхронизированы с помощью git-репо, все версии идентичны. Я перенес один и тот же terminfo
файл, связанный с xterm-kitty
на обоих хостах. Также, используяэтотскрипт, я вижу, что все цвета отображаются правильно и идентичны на обоих хостах.
Я также заметил, что вход на удаленную машину без tmux дает еще одну комбинацию цветов (везде используется один и тот же файл конфигурации fish):
решение1
default-terminal
устанавливает значение по умолчанию TERM
внутри tmux. Не устанавливайте его в xterm-kitty
- tmux не является xterm или kitty. Установите его в tmux-256color
, если он существует на вашем компьютере (проверьте infocmp tmux-256color
), в противном случае screen-256color
.
Аналогично, не устанавливайте TERM
в профилях оболочки одно и то же значение для всех терминалов.
Строка terminal-overrides
, которую вы видите, сообщает tmux, что когда он видит TERM
значение set, xterm-kitty
это означает, что терминал поддерживает настоящий (RGB) цвет (следовательно Tc
).
TERM
Внутри tmux сообщает программам внутри tmux, с чем они общаются (tmux). TERM
Снаружи tmux сообщает tmux, с чем он общается (в данном случае с kitty).
Если локально работает, но по ssh не работает, то наиболее вероятные причины:
Различается
TERM
за пределами tmux. Вы уверены,echo $TERM
что показывает одно и то же непосредственно перед запуском tmux на локальном компьютере и через ssh?Конфиги tmux на самом деле не одинаковые, вы уверены? Если вам нужно
terminal-overrides
в одном месте, то и в другом понадобится, если нет, то и нет.Вы уверены,
xterm-kitty
что он существует на обоих компьютерах и одинаков? Проверьтеinfocmp xterm-kitty
.Разные версии tmux. Вы уверены, что они одинаковые? Проверьте
tmux -V
.
решение2
Если вы используете tmux на локальной машине, а затем запускаете ssh на удаленной машине, то удаленный сеанс не сможет определить, что вы можете использовать цвета RGB вместо (или в дополнение к) индексированным (256-цветам). Это потому, что переопределение tmux "Tc" не видно удаленному сеансу.
Вы можете обойти это, изменив описание терминала, которое соответствуеттерминал по умолчаниюнастройка tmux, например, путем добавления любых настроек, которые вы используете стерминал-переопределенияв текстовый файл для описания терминала и используяtic
для компиляции (на каждой машине). Например (еслитерминал по умолчаниюявляетсяtmux
):
infocmp -x tmux >foo
printf '\tTc,\n' >>foo
tic -x foo
У Китти естьЧасто задаваемые вопросы, но он игнорирует "-x" дляinfocmp
.
Осталось рассмотреть еще несколько моментов:
Копирование двоичных файлов, созданных
tic
ненадежен (по нескольким причинам).Если такое же описание терминала доступно на удаленной стороне, вы получите (более) согласованное поведение, предполагая, что удаленное приложение использует описание терминала.содержаниеа неимяописания терминала.
решение3
Удалось исправить! Это была комбинация всех данных ответов с одной важной дополнительной переменной.
Необходимые шаги:
- Убедитесь, что
TERM
используемые переменные одинаковы на каждом хосте и внутри каждого tmux (в итоге я использовал ихxterm-kitty
непосредственно на хостах иtlux-256color
внутри сеансов TMUX).Спасибо Николасу Марриотту. - добавить
Tc;
в infocmp терминалов, которые я использую, используяэтот фрагмент предоставлен Томасом Дики:
infocmp -x tmux-256color >foo
printf '\tTc,\n' >>foo
tic -x foo
- Добавьте
set -g fish_term24bit 1
в мой config.fish, чтобы заставить fish использовать режим trucolor.