如何确保从 Vim 中的 .vimrc 加载正确的状态行突出显示

How to make sure proper statusline highlighting is loaded from .vimrc in Vim

我正在为 VIM 制作自定义状态栏。我希望状态行的颜色根据当前模式动态变化。我通过以下方式实现:

" Automatically change the statusline color depending on mode

hi NormalColor guifg=Black guibg=Green ctermbg=46 ctermfg=0
hi InsertColor guifg=Black guibg=Cyan ctermbg=51 ctermfg=0
hi ReplaceColor guifg=Black guibg=maroon1 ctermbg=165 ctermfg=0
hi VisualColor guifg=Black guibg=Orange ctermbg=202 ctermfg=0


set laststatus=2
set statusline=
set statusline+=%#NormalColor#%{(mode()=='n')?'\ \ NORMAL\ ':''}
set statusline+=%#InsertColor#%{(mode()=='i')?'\ \ INSERT\ ':''}
set statusline+=%#ReplaceColor#%{(mode()=='R')?'\ \ RPLACE\ ':''}
set statusline+=%#VisualColor#%{(mode()=='v')?'\ \ VISUAL\ ':''}

当我执行 :source .vimrc 时它工作得很好但是它不会在 Vim 启动时自动工作。我在设置colorscheme和dark mode后设置了highlighting,但是还是有这个问题

我相信这与我在 .vimrc 中的会话加载有关 可以参考

silent source ~/.vim/session.vim

如果我使用像 DiffAdd 这样的自定义颜色或像 GruvboxPurple

这样的颜色方案也没有问题

我通过分组找到了解决方法:

augroup coloring
    autocmd VimEnter * hi NormalColor guifg=Black guibg=Green ctermbg=46    ctermfg=0
    autocmd VimEnter * hi InsertColor guifg=Black guibg=Cyan ctermbg=51 ctermfg=0
    autocmd VimEnter * hi ReplaceColor guifg=Black guibg=maroon1 ctermbg=165 ctermfg=0
    autocmd VimEnter * hi VisualColor guifg=Black guibg=Orange ctermbg=202 ctermfg=0
augroup END

但是我觉得我做的不对。

您的问题是您将选项保存在 Session.vim 中(set ssop+=options --- 这是 Vim 的默认设置!),它已加载 vimrc 之后,因此,在启动时保存在Session.vim 中的选项 do 重新定义 vimrc 中的选项。您可以始终保持它们同步(IMO,这很不方便),或者(更好)不要将它们保存在会话文件中。

但是,如果您没有在 Session.vim 中保存任何选项,那么您也会丢失所有打开的缓冲区的文件类型信息。

通常,文件类型信息是在自动命令机制的帮助下设置的。但是,默认情况下 Vim 禁止递归自动命令调用(即在执行另一个自动命令时调用自动命令)。因此,如果您通过自动命令加载会话文件,那么文件类型检测将被有效禁止。

所以基本上你有以下选择:

  • 禁用 options(不干扰 vimrc 中的全局设置)但添加 localoptions(以便保存额外的缓冲区设置)
  • 禁用options并使用++nested(或nested旧Vim版本)明确允许递归自动命令
  • 禁用 options 并且不使用自动命令加载会话(例如使用 vim -S

IMO,(1) 感觉有点尴尬,因为在 vimrc 中设置的一些选项可能是全局-局部的,所以可能会出现一些冲突。