Когда я открываю vim внутри панели TMUX, панель заполняется кодами, которые я не узнаю. Если я просто запускаю vim, я получаю следующее:
^[[38;2;165;42;42m 1
^[[38;2;0;0;255m~
Если я открываю файл с помощью vim, я получаю что-то вроде этого (верхняя панель):

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





Похоже, что 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., вы можете записать эту функцию 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 неправильно настроен для поддержки истинных цветов. Спасибо!
Не уверен, что это помогает, но коды, которые вы видите, похоже, соответствуют константам, определяющим цвета qqtop.github.io/private.html из библиотеки nim