我对我的配色方案如何与vim中的term交互不完全了解,这阻碍了我使其能够在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调用neovim,如下所示:

TERM=xterm nvim


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



为什么必须要组合termset term=xterm才能在vim中正确显示此配色方案,以及为什么等价的设置组合会在neovim中产生不同的结果?

编辑:

默认值为set t_Co=256,由于某些原因,必须将其替换为常规vim中的$TERM=xterm256-color,以使彩色显示正确。当环境变量的默认值为256时,neovim如下所示:



这与带有xterm的常规vim相同,但不是预期的。我的目标是了解为什么xterm hack在vim中是必需的/可以工作,以及为什么它在neovim中看起来不一样。

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

评论

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

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

您能否提供在正确呈现主题时使用的iTerm颜色配置的屏幕截图以及运行此脚本的输出?

#1 楼

主要问题

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

加载颜色方案后设置g:impact_transbg变量,并且
,所以当通过colorscheme的if语句检查该变量时不存在,并且
使用了colorcheme的第二个版本(在else块中)。

要修复,您只需要将设置变量的行移动到加载颜色方案的行上方


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'设置回
'term'设置为正确的值,您将
不需要。

't_Co'后手动更改g:impact_transbg时,
会导致重新加载颜色方案(以使colorcheme适应
新的颜色数),并且由于现在已设置g:impact_transbg,因此您将获得所需的
颜色。

(省略行设置'term'时,当您将
连接到.vimrc中的后一行时,'t_Co'已经设置为256,因此不会重新加载colorcheme:因此
颜色错误。)

因此,要概括一下:

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


结果:当'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'的调用,就像其他回答者已经提到的那样。

'background'

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

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

评论


谢谢,这是非常彻底的,我感谢其他背景。

–康拉德·迈耶(Conrad Meyer)
19/12/7在6:48

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

–丰富
19/12/8在21:35

#2 楼

对于Neovim,t_CoTERM没什么区别。

您在调用set background=dark之前和之后都调用colorscheme impact3。将set background=dark移到颜色方案的底部,然后从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不在乎t_Co,因为除非您启用“真彩色”,否则它假定为256。


实际上Neovim忽略了所有t_*选项,请参阅:help t_xx


Neovim不允许设置&term,因为它毫无意义。 Neovim使用unibilium和其他机制来检测终端功能。


评论


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

–画廊
2015年6月15日在3:09



#3 楼

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


打开“偏好设置”窗口⌘+,

转到profiles选项卡
检查您的当前个人资料在左侧列表中
单击右侧的terminal选项卡
Report terminal type中选择xterm-256color

完成。


评论


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

–画廊
15年6月13日在23:08

#4 楼

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

let $NVIM_TUI_ENABLE_TRUE_COLOR=1 " True gui colors in terminal




export NVIM_TUI_ENABLE_TRUE_COLOR=1


在外壳中。

评论


仅供参考:这将需要使用guifg和guibg。 OP的colorscheme使用ctermfg和ctermbg。

–贾斯汀·凯斯(Justin M. Keyes)
15年6月14日在17:42

哦,对了。抱歉!

–扬·范哈勒维恩(Yann Vanhalewyn)
2015年6月19日下午4:35

#5 楼

您需要在您的.config/nvim/init.vim中设置选项

let $NVIM_TUI_ENABLE_TRUE_COLOR=1 
set termguicolors




评论


这些选项用于将guifg和guibg RGB值用于颜色。问题的配色方案仅使用ctermfg和ctermbg。

–汤米A
16年7月4日在14:30

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

– Qix-蒙尼卡(MS)被盗
16 Dec 3'在11:41

#6 楼

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

注释第二种配色方案和if- else语句(仅保留所需的配色方案并取消使用g:impact_transbg)即使在删除set term=xtermset t_Co=256的情况下,也会在vim和neovim中产生预期的行为。

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

set term=xterm
set t_co=256


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

#7 楼

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

TERM=xterm-256color


也尝试像这样启动nvim:

export TERM=xterm-256color; nvim


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

评论


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

–画廊
15年6月13日在23:09

#8 楼

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

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

评论


OPs TERM已设置为xterm-256color。我认为您遇到了另一个问题。

–丰富
16-10-25在14:58