Похоже, что Vim отправляет управляющие последовательности на ваш терминал, который последний не понимает.
В частности, последовательности, которые вы упомянули в ОП:
^[[38;2;165;42;42m
^[[38;2;0;0;255m
похоже, что они кодируют истинные цвета переднего плана для текста.
Вы можете найти их синтаксис здесь :
CSI Pm m
, где CSI
обозначает «вводник последовательности управления» и генерируется клавишами ESC [
, а Pm
обозначает:
Множественный числовой параметр, состоящий из любого числа одиночных числовых параметров, разделенных; символ (ы).
Если вы прокрутите страницу вниз, вы должны найти описание более подробного синтаксиса:
Атрибуты символов CSI Pm m (SGR).
...
Этот вариант ISO-8613-6 поддерживается для совместимости с 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 объяснения:
- терминал не поддерживает истинные цвета
- tmux неправильно настроен для поддержки истинных цветов
- 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