无法让配色方案在 Neovim 中正确显示

无法让配色方案在 Neovim 中正确显示

我已经摆弄 neovim 配色方案有一段时间了,但无法使它们看起来与预览相同。

我在 osx 上使用terminal.app,并认为这是256色上限问题,所以我转向了具有真彩色支持的iterm2 - 虽然它改进了一些东西,但配色方案与我看到的屏幕截图相去甚远!

在此输入图像描述

这就是 Solarized 主题在 iterm2 + neovim 中的样子

在此输入图像描述

这与https://github.com/altercation/vim-colors-solarized截图!

我使用过 google foo 但没有成功,当然有一种方法可以使颜色正确。有任何想法吗?

  "*****************************************************************************
"" Plug install packages
"*****************************************************************************

" Specify a directory for plugins
call plug#begin('~/.config/nvim/plugged')

Plug 'tomasr/molokai'
Plug 'dracula/vim'
Plug 'justb3a/vim-smarties'
Plug 'tyrannicaltoucan/vim-quantum' " let g:quantum_black = 1
Plug 'mhartington/oceanic-next'
Plug 'altercation/vim-colors-solarized'
" Plug 'vim-scripts/CSApprox'
Plug 'ctrlpvim/ctrlp.vim'
Plug 'scrooloose/nerdtree'
Plug 'airblade/vim-gitgutter'
Plug 'bronson/vim-trailing-whitespace'
Plug 'editorconfig/editorconfig-vim'
Plug 'Raimondi/delimitMate'
Plug 'scrooloose/syntastic'
Plug 'Yggdroot/indentLine'
Plug 'tpope/vim-commentary'
Plug 'sheerun/vim-polyglot'
Plug 'valloric/matchtagalways'

" Initialize plugin system
call plug#end()

"*****************************************************************************
"" Visual Settings
"*****************************************************************************
set number
set ruler
set nowrap

let $NVIM_TUI_ENABLE_TRUE_COLOR=1 
set termguicolors " unfortunately doesn't work in terminal.app - needs true color support, like iterm2 but it lags and diff in visuals is not that much so sticking to terminal.app for now

set background=dark
colorscheme solarized

"*****************************************************************************
"" NERDTree config
"*****************************************************************************

" open NERDTree automatically when vim starts up on opening a directory
autocmd StdinReadPre * let s:std_in=1
autocmd VimEnter * if argc() == 1 && isdirectory(argv()[0]) && !exists("s:std_in") | exe 'NERDTree' argv()[0] | wincmd p | ene | endif

" keep focus on NERDTree when opening a directory
autocmd VimEnter * wincmd p

" close vim if the only window left open is a NERDTree
autocmd bufenter * if (winnr("$") == 1 && exists("b:NERDTree") && b:NERDTree.isTabTree()) | q | endif

"*****************************************************************************
"" Optimizations
"*****************************************************************************

set lazyredraw

let g:python_host_skip_check = 1
let g:python3_host_skip_check = 1

"*****************************************************************************
"" syntastic
"*****************************************************************************

let g:syntastic_always_populate_loc_list = 1
let g:syntastic_auto_loc_list = 1
let g:syntastic_check_on_open = 1
let g:syntastic_check_on_wq = 0

"*****************************************************************************
"" yank and cut to osx clipboard
"*****************************************************************************

noremap YY "+y<CR>
noremap XX "+x<CR>

"*****************************************************************************
"" indent
"*****************************************************************************

" tabs
set listchars=tab:˗\ ,eol:¬
set list

" spaces
let g:indentLine_enabled = 1
let g:indentLine_concealcursor = 0
let g:indentLine_char = '·'
let g:indentLine_faster = 1

set tabstop=2

"*****************************************************************************
"" matchtagalways
"*****************************************************************************

let g:mta_filetypes = { 'html' : 1, 'xhtml' : 1, 'xml' : 1, 'jinja' : 1, 'php': 1 }

"*****************************************************************************
"" ctrlp
"*****************************************************************************

set wildignore+=*.o,*.obj,.git,*.rbc,*.pyc,__pycache__
let g:ctrlp_custom_ignore = '\v[\/](node_modules|target|dist)|(\.(swp|tox|ico|git|hg|svn))$'

答案1

每个配色方案都独立于 GUI 颜色定义终端颜色。传统上,终端最多支持 256 种颜色,并且大多使用 16 种颜色的调色板。 GUI 通常支持 24 位颜色,因此 Vim(和 Neovim)为配色方案作者提供单独的突出显示设置。

如今,许多现代终端也支持 24 位颜色。然而,即使在这样的终端中运行,Neovim 通常也会使用终端配色方案和 256 色渲染方法。这个设置

set termguicolors

使 Neovim 使用 GUI 颜色方案设置渲染 24 位颜色。然而,这才不是导致 Neovim 假装它实际上在 GUI 中运行——也就是说,has('gui_running')正确仍然是错误的。

不幸的是,由于 GUI 模式与 24 位颜色模式历史上的合并,您可能会发现某些插件无法termguicolors正确处理。你的情况就是这样一个场景。 vim-solarized-colors 的当前实现用于has('gui_running')为 24 位颜色模式设置正确的颜色,因此当 Neovim 使用 24 位颜色但未在 GUI 中运行时,它最终会设置错误值的奇怪混合。

幸运的是,修复方法非常简单:修补 vim-solarized-colors 以在&termguicolors适当的地方遵守。您可以在以下位置找到该补丁这次提交在我的插件分支上。顺便说一句,该分支包含一些您可能会发现有用的其他补丁。请随意在您的 Vim 配置中指向它,或者根据需要将补丁应用到您自己的版本。

相关内容