Vim:t_Co=256和term=xterm-256color在与TMUX一起使用时的区别

45

我正在测试使用SSH连接已在Tmux上设置的Linux机器时所使用的各种终端。

基本上,我注意到了这种行为,并希望有人能够解释一下发生了什么。现在可能是这特定行为只影响Prompt应用程序。

我正在Tmux内使用Vim,在我的iPhone5上使用Panic的Prompt应用程序时,当.vimrc使用set t_Co=256指令设置颜色时,256色未被启用。在不通过Tmux运行Vim时,Vim可以正确地显示颜色。此外,OS X的Terminal.app也可以在Tmux中正确地呈现颜色(不幸的是我没有在Windows上使用PuTTY进行测试)。

然后我将set t_Co=256替换为set term=xterm-256color,现在在通过Tmux使用Vim时颜色可以正常工作。

还要注意,我测试了Tmux的set -g default-terminal "xterm-256color"set -g default-terminal "screen-256color"两个设置,但更改并没有影响行为。


1
vim < ssh < tmux < smartphone… 有人能告诉我我们什么时候跳过了这个点吗? - romainl
6
你的排序错了,正确的顺序应该是vim < tmux < ssh < 通过LTE连接的智能手机,而且这个组合非常棒,因为无论在哪里,你都可以直接回到上次离开的终端会话。确切地说,就是任何地方。 - Steven Lu
智能手机部分是最疯狂的部分。 - romainl
1
请注意,如果这是一个关于 nvim 的问题而不是 vim 的问题,答案将会不同。 - JdeBP
2个回答

97
当您不使用tmux或screen时,只需要将终端仿真器配置为将自己广告为“能够显示256种颜色”的方式之一,通过将它们的TERM设置为xterm-256color或任何可与您的终端和平台配合使用的相似值。如何实现这一点取决于终端仿真器,超出了您的问题和这个答案的范围。
在Vim中,您不需要做任何事情,因为它本身就可以做正确的事情。
当您使用tmux或screen时,这些程序会设置自己的默认值$TERM,通常是screen,然后Vim会根据给定的信息执行必要的操作。
如果您想要更加统一(且丰富多彩)的行为,则必须将它们配置为使用“更好”的$TERM值:
- tmux
将以下行添加到~/.tmux.conf:
set -g default-terminal "screen-256color"
  • 屏幕

    将以下内容添加到~/.screenrc文件中:

  • term "screen-256color"
    

    现在,两个多路复用器都会告诉Vim它们支持256种颜色,而Vim将按照你的期望做出反应。

    编辑

    我的答案假设您能够编辑这些配置文件,但是,由于您能够编辑~ / .vimrc,我认为我离正确答案并不远。

    编辑2

    term选项的值(使用&term检索)是由Vim在启动时选择的终端名称。该名称是您应该在终端仿真器本身中设置的名称。

    t_Co选项(&t_Co)的值是Vim认为主机终端可以显示的最大颜色数。它根据terminfo中对应于$ TERM 的条目定义:

     term            | t_Co
    -----------------+------ 
     xterm           | 8
     xterm-256color  | 256
     screen          | 8
     screen-256color | 256
    
    当Vim启动时,它获取TERM环境变量的值,使用该值查询terminfo数据库,并将有关其环境的多个信息存储在几个t_...变量中,其中包括可用颜色的数量t_Co。对于一个“合法”的终端类型(Vim可以查找到的类型),Vim始终假定正确的颜色数量。
    t_Co设置为256,同时保留term的Vim定义值,或更一般地,将t_Co和/或term设置为与主机终端不匹配的值是没有意义的,并且可能会在Vim发送不被终端理解的信号或反之时创建麻烦。
    虽然完全可以这样做,但在Vim中搞弄t_Coterm既毫无意义又可能有害。
    再次强调,只需正确设置您的终端仿真器和终端复用器即可。这真的就是你需要的全部。 如果你进入一个终端复用器或终端仿真器中,你无法定义正确的TERM,那么只有在这种情况下,你可以强制Vim假定256种颜色。为此,更改t_Co的值是唯一有意义的事情:
    if &term == "screen"
      set t_Co=256
    endif
    

    所以,如果你 可以 配置每一个单独的部分:

    • 终端模拟器: xterm-256color
    • tmux/screen: screen-256color
    • vim:什么也不用做

    然后你就完成了。

    如果你 无法 控制每个部件,可以在你的 ~/.vimrc 中使用一个简单的条件语句根据 &term 来设置 t_Co 的值,但是不要改变 term 的值。

    但是,如果你可以编辑 ~/.vimrc,那么没有理由不能编辑 ~/.screenrc~/.tmux.conf~/.bashrc 或其他文件。


    我已经在问题中指明这不是答案。现在我意识到这个答案可能会帮助其他读者(因为它涵盖了我已经完全考虑和测试过的内容),但它并不是关于这两个vim设置之间差异的问题的答案。 - Steven Lu
    3
    这是根本问题的答案。您完全不需要在Vim中做任何事情。 - romainl
    1
    这个回答相当详细。谢谢。 - Steven Lu
    6
    根据我的经验,我认为这是所有SO答案中关于终端最好的答案之一,我在花时间学习终端、它们的颜色系统、vim、tmux和所有相关内容时不得不浏览过许多答案。它正确地解释了基础知识,我愿意打赌,人们在使用终端和颜色时遇到的一半问题是因为他们不理解正在发生的事情(嗯,当然),但他们愿意盲目地复制粘贴东西到他们的shell启动脚本和配置文件中。这个答案应该被收藏,并希望能够详细解释。做得好。 - Armen Michaeli
    1
    我完全同意@amn上面的评论 :)太棒了,@romainl的回答!真的,解释得非常好。谢谢 :) - 3.141592
    在Vim 8上,一切可能不会“只是”工作。首先,这个答案没有深入探讨terminfo数据库的细节,这是使一切正常工作的原因:https://github.com/mirror/ncurses/blob/master/misc/terminfo.src。条目可能缺少必要的配置来指示客户端终端支持的颜色能力。其次,即使所有相关的terminfo条目都是正确的,Vim可能会显示xterm-*条目的颜色,但不会显示其他条目的颜色;在这种情况下,请参见“:h xterm-true-color”。 - mkjeldsen

    11
    你可以同时使用set t_Co=256set term=xterm-256colorterm告诉Vim使用什么终端,控制Vim的所有方面的显示/渲染,包括如何映射按键输入、重新绘制屏幕、移动光标、显示颜色等。通常情况下,Vim可以通过您的操作系统提供的TERM环境变量自行确定这一点。
    如果OS值不正确,则明确设置它通常会很有帮助。特别是如果你从一个终端模拟器连接到网络,它没有提供正确的值。 t_Co是终端选项之一(由Vim用于终端控制的termcap系统使用)。它具体指的是终端支持的颜色数。有时,如果终端仿真基本正确,但Vim没有正确识别支持的颜色数,则需要覆盖此选项。
    我在我的.vimrc中使用这两个选项,以确保Vim在我喜欢的所有终端上(Ubuntu的gnome-terminal、OSX的iTerm2和Windows的KiTTY)中使用256种颜色。我还将大多数这些终端明确配置为发送xterm-256color作为它们的终端类型。

    1
    我从未意识到我可以同时设置两个。我认为这可能是使事情“正常工作”的最佳机会。谢谢。 - Steven Lu
    这里的主要争议点是,为什么当我告诉Tmux通过 set -g default-terminal "xterm-256color" 来指定时,并且通过在tmux中运行 echo $TERM 验证它报告 xterm-256color ,但vim在tmux内运行时仍然无法提供正确的着色,除非我使用vim的 set term=xterm-256color?至少在我的iPhone中,在提示符内可以这样做。 - Steven Lu
    @StevenLu,你必须使用screen-256color而不是xterm-256color - romainl
    我在所有地方都使用xterm-256color 。终端仿真器设置、Linux shell配置(zsh)、Vim的term设置以及tmux的default-terminal设置。我不在任何地方使用screen-256color - Jim Stewart
    3
    screen-256color 是 tmux 推荐的颜色 TERM。解决 tmux 中的颜色问题就像正确设置并不试图搞乱 vim 特定的技巧一样容易。坦率地说,所有在一个人的 ~/.vimrc 文件中的这些花招都是完全无用的。 - romainl
    @romainl是正确的; 如果我将iTerm2设置为screen-256color并完全省略zsh,tmux和vim中的任何终端设置,则所有工作都正常。我知道我之前加入了一些这些花哨的东西,但那是几年前在Linux上,没有tmux和gnome-terminal。那里可能也可以只用screen-256color。 - Jim Stewart

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接