Что здесь происходит с vim на панели TMUX? - PullRequest
0 голосов
/ 15 ноября 2018

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

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

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

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

1 Ответ

0 голосов
/ 16 ноября 2018

Похоже, что 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 объяснения:

  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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...