TMUX窗格中的vim这是怎么回事?

时间:2018-11-15 20:32:24

标签: linux vim tmux

当我在TMUX窗格中打开vim时,该窗格中充满了我无法识别的代码。如果我只运行vim,我会得到:

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

如果使用vim打开文件,则会得到以下信息(顶部窗格): enter image description here

vim和TMUX都相当新。我该怎么解决?

1 个答案:

答案 0 :(得分:3)

似乎Vim正在将控制序列发送到您的终端,而后者不明白。
更具体地说,您在OP中提到的序列:

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

看起来他们正在为文本编码前景色。

您可以找到其语法here

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.的问题,可以在~/.bashrc中编写此bash函数:

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'
}

然后在tmux外部的shell中执行$ truecolor。如果您遇到彩虹,则说明您的终端支持真彩色(至少部分支持)。 如果您看到一些未着色的单元格,而另一些则是随机着色的,则表明您的终端不支持真彩色。

或者,您可以手动尝试序列:

$ 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命令不更改文本的前景色(不是背景色),则您必须: / p>

  • 在您的'termguicolors'中禁用~/.vimrc;即删除set termguicolors(或使其执行set notermguicolors
  • 尝试并升级您的终端机
  • 找到another terminal,它支持真彩色

要测试2.是否是问题,请在tmux内部执行以下shell命令:

$ 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
                ^^^^

如果没有,请查看tmux外部$TERM的输出:

$ 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

您可以通过依次执行以下命令来检查这三个选项的当前值:

: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