NeoVim中使用配色方案时遇到问题


16

我对我的配色方案如何与termvim中的设置交互不完全了解,这妨碍了我使其在Neovim中正确显示的能力。

在我的.vimrc文件中,有关颜色方案的正确行为需要设置

set term=xterm
set t_Co=256

忽略这些设置中的任何一个都会导致颜色方案的显示不正确:

正确 正确的颜色显示 不正确 颜色显示不正确 不同不正确 色彩显示不正确

该方案如下所示:

set background=dark
hi clear
if exists("syntax_on")
    syntax reset
endif
let g:colors_name="impact3"

if exists("g:impact_transbg")
    hi Normal       ctermfg=255 ctermbg=none
    hi NonText      ctermfg=DarkGray  ctermbg=none

    hi Statement    ctermfg=Blue      ctermbg=none
    hi Comment      ctermfg=DarkGray  ctermbg=none cterm=bold term=bold
    hi Constant     ctermfg=173  ctermbg=none
    hi Identifier   ctermfg=Cyan      ctermbg=none
    hi Type         ctermfg=DarkGreen ctermbg=none
    hi Folded       ctermfg=0 ctermbg=235 cterm=underline term=none
    hi Special      ctermfg=Blue      ctermbg=none
    hi PreProc      ctermfg=LightGray ctermbg=none cterm=bold term=bold
    hi Scrollbar    ctermfg=Blue      ctermbg=none
    hi Cursor       ctermfg=white     ctermbg=none
    hi ErrorMsg     ctermfg=Red       ctermbg=none cterm=bold term=bold
    hi WarningMsg   ctermfg=Yellow    ctermbg=none
    hi VertSplit    ctermfg=0     ctermbg=0
    hi Directory    ctermfg=Cyan      ctermbg=DarkBlue
    hi Visual       ctermfg=White     ctermbg=Gray cterm=underline term=none
    hi Title        ctermfg=255     ctermbg=Blue
    hi String       ctermfg=Blue   ctermbg=none

    hi StatusLine   term=bold cterm=bold,underline ctermfg=White ctermbg=Black
    hi StatusLineNC term=bold cterm=bold,underline ctermfg=Gray  ctermbg=Black
    hi LineNr       term=bold cterm=bold ctermfg=2 ctermbg=None
    hi Search       ctermfg=Black ctermbg=2
    hi TabLine      ctermfg=0 ctermbg=DarkGray
    hi TabLineFill  ctermfg=DarkGray ctermbg=DarkGray
else
    hi Normal       ctermfg=White ctermbg=Black
    hi NonText      ctermfg=DarkGray  ctermbg=Black

    hi Statement    ctermfg=Blue      ctermbg=Black
    hi Comment      ctermfg=DarkGray  ctermbg=Black cterm=bold term=bold
    hi Constant     ctermfg=DarkCyan  ctermbg=Black
    hi Identifier   ctermfg=Cyan      ctermbg=Black
    hi Type         ctermfg=DarkGreen ctermbg=Black
    hi Folded       ctermfg=DarkGreen ctermbg=Black cterm=underline term=none
    hi Special      ctermfg=Blue      ctermbg=Black
    hi PreProc      ctermfg=LightGray ctermbg=Black cterm=bold term=bold
    hi Scrollbar    ctermfg=Blue      ctermbg=Black
    hi Cursor       ctermfg=white     ctermbg=Black
    hi ErrorMsg     ctermfg=Red       ctermbg=Black cterm=bold term=bold
    hi WarningMsg   ctermfg=Yellow    ctermbg=Black
    hi VertSplit    ctermfg=White     ctermbg=Black
    hi Directory    ctermfg=Cyan      ctermbg=DarkBlue
    hi Visual       ctermfg=White     ctermbg=DarkGray cterm=underline term=none
    hi Title        ctermfg=White     ctermbg=DarkBlue

    hi StatusLine   term=bold cterm=bold,underline ctermfg=White ctermbg=Black
    hi StatusLineNC term=bold cterm=bold,underline ctermfg=Gray  ctermbg=Black
    hi LineNr       term=bold cterm=bold ctermfg=White ctermbg=Black
endif

在neovim中,term无法设置。我尝试使用手动设置的$ TERM调用neovim,如下所示:

TERM=xterm nvim

这样可以在常规vim中正确显示颜色(即等效于.vimrc中的设置术语),但是在neovim中,它看起来像这样:

在此处输入图片说明

为什么要在vim中产生该配色方案的正确显示set term=xterm并进行set t_Co=256必要的组合,为什么在neovim中等效的设置组合会产生不同的结果?

编辑:

默认值为 $TERM=xterm256-color出于某种原因,必须xterm在常规vim中将其覆盖以使颜色正确显示。当环境变量的默认值为256时,neovim如下所示:

在此处输入图片说明

这与带有的常规vim相同xterm256-color,但不符合预期。我的目标是了解为什么xterm hack在Vim中是必需/有效的,以及为什么它在neovim中看起来并不相同。

请注意,使用上述术语env变量设置可以正确显示许多颜色,值得注意的例外是行号和背景。我怀疑可能涉及此特定配色方案中指定颜色的方式。


1
您的$ TERM已设置为现代系统上通常认为的“正确”值-启用256色。因此,通常不需要与旧终端兼容的t_Co选项。如果您注释掉两个配置行怎么办?
大卫·洛德

@David注释掉两个配置行看起来与注释掉相同set term=xterm
2015年

您是否可以包含在正确渲染主题时使用的iTerm颜色配置的屏幕截图以及运行此脚本的输出?
Eric Pruitt

Answers:


11

主要问题

您遇到的主要问题是由于您命令中的命令顺序引起的.vimrc

您可以设置g:impact_transbg变量后,您加载色彩方案,所以变量不,当由色彩方案的检查存在的if语句和色彩方案的第二个版本(在else使用块)。

要解决此问题,您只需要将设置变量的行移到加载colorcheme的行上方:

let g:impact_transbg=1
colorscheme impact3

您可以(并且应该!)然后从您的中删除不必要的行.vimrc

set term=xterm
set background=dark
set t_Co=256

其他问题

我还可以消除您对这一切的工作方式可能存在的其他误解/困惑:

解释'term'&的行为't_Co'

您的$ TERM设置为xterm256-color。Vim读取此内容,并查询terminfo(或termcap)以找出终端支持的颜色数,然后进行相应设置 't_Co'。假设你的$ TERM是正确的(你是)和你的terminfo数据库包含终端(你做),你应该正确的信息永远需要手动复位't_Co'

但是,您随后将Vim手动设置'term'为xterm。您的terminfo告诉Vim,此终端仅支持8种颜色,因此添加该颜色将导致 't_Co'错误地将其设置为8。您正在手动将其设置't_Co' 256,但是如果您将该'term'设置保留为正确的值,则无需。

顺便说一下,当您更改't_Co'设置后,手动g:impact_transbg,它会导致色彩方案被重新加载(允许色彩方案,以适应色彩的新号码),并且因为g:impact_transbg 现在设置,你会得到你想要的颜色。

(与设置行'term'省略,'t_Co'已经设置为256,当你在你的.vimrc后者一致,所以色彩方案不会重新加载。因此,错误的颜色)

因此,回顾一下:

term=xterm
colorscheme impact3
let g:impact_transbg=1
set t_Co=256

结果:将Colorscheme 't_Co'设置为256 时重新加载,颜色正确。

"term=xterm
colorscheme impact3
let g:impact_transbg=1
set t_Co=256

结果:Colorscheme由colorscheme命令加载,变量不存在,颜色错误。

term=xterm
colorscheme impact3
let g:impact_transbg=1
"set t_Co=256

结果:Colorscheme由colorscheme命令加载,变量不存在,Vim仅使用8种颜色,颜色是错误的。

"term=xterm
colorscheme impact3
let g:impact_transbg=1
"set t_Co=256

结果:Colorscheme由colorscheme命令加载,变量不存在,颜色错误。

let g:impact_transbg=1
colorscheme impact3

结果:Colorscheme由colorscheme命令加载,变量确实存在,因此颜色正确。(作为奖励'term''t_Co'也是正确的!)

NeoVim的行为有所不同,只是因为't_Co'忽略了对set的调用,就像其他答复者已经提到的那样。

'background'

设置颜色方案后,还可以设置'background'。对于这种特定的 颜色方案,这是完全没有必要的,因为颜色方案的第一件事就是设置'background''dark'

请注意,我不同意另一位回答者的意见,后者建议您'background'在加载颜色方案后进行设置 。colorscheme可能使用的值'background'来调整其颜色,因此'background'在加载colorcheme之前进行设置更为明显。(尽管请注意,如果您更改'background'设置,Vim会重新加载所有已加载的配色方案,因此'background'此后也可以设置:这不是最佳选择。)


1
谢谢,这是非常彻底的,我感谢其他背景。
康拉德·迈耶

@ConradMeyer很高兴它对您有所帮助!
Rich

7

在Neovim的情况下,t_CoTERM没有什么区别。

您正在呼叫set background=dark之前之后colorscheme impact3。移动set background=dark到colorscheme的底部,然后从vimrc中删除另一个调用。

来自:help 'background'

When 'background' is set Vim will adjust the default color 
groups for the new value.
...
When a color scheme is loaded (the "g:colors_name" variable 
is set) setting 'background' will cause the color scheme to 
be reloaded.

另请参阅:https : //github.com/justinmk/molokai/commit/aa1cc201c743dd7d1b80bb2e2b5fbb7894ebfe5f

我的目标是了解为什么xterm hack在Vim中是必需/有效的,以及为什么它在neovim中看起来并不相同。

  • Neovim不在乎,t_Co因为除非您启用“ true color”,否则它将假定为256 。
    • 实际上,Neovim会忽略所有t_*选项,请参见:help t_xx
  • Neovim不允许&term设置,因为它毫无意义。Neovim使用Unibilium和其他机制来检测终端功能。

非常感谢您对Neovim术语能力检测和`t_ *`设置的见解。删除的冗余副本并重新放置该set background=dark语句没有任何效果,但是有关基础实现的那些细节对我来说更有价值。
2015年

2

我看到您使用iTerm2,因此可以尝试以下操作:

  1. 打开偏好窗口+,
  2. 转到profiles标签
  3. 在左侧列表中检查您当前的个人资料
  4. 点击terminal右边的标签
  5. Report terminal type选择xterm-256color
  6. 做完了

感谢您的建议。我编辑了上面有关的评论xterm-256color。我按照您的程序进行操作,以查找已经设置的终端类型。
2015年

2

您缺少一个很棒的NeoVim功能。有一个env var可以帮助解决这些问题。尝试将其放在您的nvimrc中:

let $NVIM_TUI_ENABLE_TRUE_COLOR=1 " True gui colors in terminal

要么

export NVIM_TUI_ENABLE_TRUE_COLOR=1

在外壳中。


仅供参考:这将需要使用guifgguibg。OP的colorscheme使用ctermfgctermbg
贾斯汀·凯斯

哦,对了。抱歉!
Yann Vanhalewyn 2015年

2

您需要设置选项

let $NVIM_TUI_ENABLE_TRUE_COLOR=1 
set termguicolors

在你的.config/nvim/init.vim


这些选项是使用guifgguibgRGB颜色值。问题的配色方案仅使用ctermfgctermbg
汤米A

1
这为我做到了。TERM已经是xterm-256color。谢谢!
Qix

1

请注意,特定的配色方案实际上是if-else子句中的两组配色方案。变量的存在会g:impact_transbg选择所需的颜色集,并且最初是要考虑从中得出该颜色的配色方案中的透明背景。

注释掉第二配色方案和if-else语句(只留下所需的配色方案和废除g:impact_transbg)产生同时针对vim预期的行为,甚至与neovim set term=xtermset t_Co=256去除。

这意味着$TERM=xterm-256colors在vim和neovim中,条件if exists("g:impact_transbg")失败,但设置的组合

set term=xterm
set t_co=256

允许条件成功。如上所述删除if-else子句可以解决实质性的问题,但是,关于.vimrc术语对和的交互仍然存在一个谜g:impact_transbg


0

尝试$TERM像这样设置环境变量:

TERM=xterm-256color

也可以尝试像这样启动nvim:

export TERM=xterm-256color; nvim

如果可行,请$TERM在您的外壳中永久设置变量。


感谢您的想法,杰夫。我用关于的评论编辑了我的问题xterm-256color。通过导出设置$ TERM无效。
2015年

0

我最近遇到了日晒主题这个问题。问题确实来自TERMenv变量。

我通过告诉终端仿真器(在我的情况下为终结器)运行env TERM=xterm-256color zsh而不是像正常那样启动zsh 来修复它。


OPs TERM已设置为xterm-256color。我认为您遇到了另一个问题。
丰富
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.