Что здесь происходит с vim внутри панели TMUX?

Когда я открываю vim внутри панели TMUX, панель заполняется кодами, которые я не узнаю. Если я просто запускаю vim, я получаю следующее:

^[[38;2;165;42;42m  1
^[[38;2;0;0;255m~

Если я открываю файл с помощью vim, я получаю что-то вроде этого (верхняя панель): Что здесь происходит с vim внутри панели TMUX?

Довольно новичок как в vim, так и в TMUX. Как я могу это решить?

Не уверен, что это помогает, но коды, которые вы видите, похоже, соответствуют константам, определяющим цвета qqtop.github.io/private.html из библиотеки nim

eckenrod 15.11.2018 21:58
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
1
674
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Похоже, что Vim отправляет на ваш терминал управляющие последовательности, которые последний не понимает. В частности, последовательности, которые вы упомянули в OP:

^[[38;2;165;42;42m
^[[38;2;0;0;255m

похоже, они кодируют истинные цвета переднего плана для текста.

Вы можете найти их синтаксис здесь:

CSI Pm m

Где CSI означает «Control Sequence Introducer» и создается клавишами ESC [, а Pm означает:

A multiple numeric parameter composed of any number of single numeric parameters, separated by ; character(s).

Если вы прокрутите страницу вниз, вы найдете описание более подробного синтаксиса:

CSI Pm m Character Attributes (SGR).

...

This variation on ISO-8613-6 is supported for compatibility with KDE konsole:

Pm = 3 8 ; 2 ; Pr; Pg; Pb
Set foreground color to the closest match in xterm's palette for
the given RGB Pr/Pg/Pb.

Pm = 4 8 ; 2 ; Pr; Pg; Pb
Set background color to the closest match in xterm's palette for
the given RGB Pr/Pg/Pb.*

Применительно к вашей первой последовательности вы можете разбить ее так:

┌ CSI
│  ┌ Pm
├─┐├────────────┐
^[[38;2;165;42;42m
        ├─┘ ├┘ ├┘
        │   │  └ Pb = amount of blue
        │   └ Pg = amount of green
        └ Pr = amount of red

Если терминал не понимает эту последовательность, я вижу 3 объяснения:

  1. терминал не поддерживает истинные цвета
  2. tmux неправильно настроен для поддержки истинных цветов
  3. Vim неправильно настроен для поддержки истинных цветов

Чтобы проверить, является ли проблема с 1., вы можете записать эту функцию bash в свой ~/.bashrc:

truecolor() {
  local i r g b
  for ((i = 0; i <= 79; i++)); do
    b=$((i*255/79))
    g=$((2*b))
    r=$((255-b))
    if [[ $g -gt 255 ]]; then
      g=$((2*255 - g))
    fi
    printf -- '\e[48;2;%d;%d;%dm \e[0m' "$r" "$g" "$b"
  done
  printf -- '\n'
}

Затем запустите $ truecolor в своей оболочке вне tmux. Если у вас есть какая-то радуга, ваш терминал поддерживает истинные цвета (хотя бы частично). Если вы видите, что некоторые ячейки не окрашены, а другие окрашены случайным образом, ваш терминал не поддерживает истинные цвета.

Кроме того, вы можете попробовать последовательности вручную:

$ printf '\e[38;2;%d;%d;%dm this text should be colored \e[0m' 165 42 42
$ printf '\e[38;2;%d;%d;%dm this text should be colored \e[0m' 0 0 255

Если $ truecolor не создает радугу, или если команды $ printf не изменяют цвет переднего плана (не цвет фона) текста, вам придется либо:

  • отключите 'termguicolors' в вашем ~/.vimrc; т.е. удалить set termguicolors (или заставить его выполнить set notermguicolors)
  • попробуйте обновить свой терминал
  • найдите другой терминал, который поддерживает истинные цвета

Чтобы проверить, является ли проблема с 2., внутри tmux вы можете выполнить эту команду оболочки:

$ tmux info | grep Tc

Если вывод содержит [missing]:

203: Tc: [missing]
         ^^^^^^^^^

это означает, что tmux не настроен для поддержки истинных цветов. В этом случае вы должны включить в ~/.tmux.conf что-то вроде этого:

set -as terminal-overrides ',*-256color:Tc'
     ││ ├────────────────┘   ├────────┘ ├┘
     ││ │                    │          └ tell tmux that the terminal suppors true colors
     ││ │                    └ configure the option only if `$TERM` ends with the string `-256color`
     ││ └ the option to configure is `terminal-overrides` (see `$ man tmux`)
     │└ the next option is a server option
     └ append the value to the tmux option instead of overwriting it

Затем перезапустите tmux и запустите $ tmux info | grep Tc. На этот раз вывод должен содержать true:

203: Tc: (flag) true
                ^^^^

Если нет, взгляните на вывод $TERM вне tmux:

$ echo $TERM

Вывод должен совпадать с любым шаблоном, который вы пишете перед :Tc.
. В предыдущем примере я использовал шаблон *-256color, который будет соответствовать любому терминалу, чей $TERM заканчивается строкой -256color. Если он не соответствует вашему $TERM, вы можете попробовать другой шаблон или просто написать * для описания любого типа терминала:

set -as terminal-overrides ',*:Tc'

Чтобы проверить, является ли проблема с 3., вы можете записать эти команды в свой ~/.vimrc:

set termguicolors
let &t_8f = "\<Esc>[38:2:%lu:%lu:%lum"
let &t_8b = "\<Esc>[48:2:%lu:%lu:%lum"

Или:

set termguicolors
let &t_8f = "\<Esc>[38;2;%lu;%lu;%lum"
let &t_8b = "\<Esc>[48;2;%lu;%lu;%lum"

Единственное различие между двумя версиями - это разделитель между параметрами последовательностей. Двоеточие в первой версии, точка с запятой во второй. См. :h xterm-true-color для получения дополнительной информации.

Вы можете проверить текущие значения этих 3 параметров, последовательно выполнив:

:echo &tgc
:echo &t_8f
:echo &t_8b

Они должны вывести:

1
^[[38:2:%lu:%lu:%lum
^[[48:2:%lu:%lu:%lum

Или:

1
^[[38;2;%lu;%lu;%lum
^[[48;2;%lu;%lu;%lum

Замечательный и четко объясненный ответ, и он решил мою проблему. Проблема заключалась в объяснении 3: tmux неправильно настроен для поддержки истинных цветов. Спасибо!

Korgan Rivera 16.11.2018 16:33

Другие вопросы по теме