【问题标题】:How to make sure proper statusline highlighting is loaded from .vimrc in Vim如何确保从 Vim 中的 .vimrc 加载正确的状态行突出显示
【发布时间】:2019-07-28 08:47:42
【问题描述】:

我正在为 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后设置了高亮,但我仍然有这个问题。

我认为这与我在 .vimrc 中的会话加载有关,可以参考How to open file in vim while having session autoload?

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

但我觉得我做错了什么。

【问题讨论】:

  • “不起作用”是什么意思?启动时set laststatus? statusline? 是什么?尝试set ssop-=options | mksession,以防您覆盖 Session.vim 中的选项。
  • 不工作意味着不使用状态行颜色。 set laststatus? statusline? 按原样显示状态行字符串。 set ssop-=options | mksession! 为状态行打开正确的突出显示,但破坏了整个文件的语法突出显示
  • breaks syntax highlighting 你不能破坏“语法”。很可能是缺少文件类型信息。确保在加载会话时有“++nested”。
  • 抱歉,我在升级到 8.1 时遇到问题,所以我不使用 ++nested 选项
  • 删除你的会话文件并将set ssop-=options放入vimrc。

标签: vim statusbar color-scheme


【解决方案1】:

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

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

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

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

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

IMO,(1) 感觉有点尴尬,因为 vimrc 中设置的某些选项可能是全局本地的,因此可能会出现一些冲突。

【讨论】:

    猜你喜欢
    • 2022-01-08
    • 2011-07-07
    • 2011-08-30
    • 1970-01-01
    • 2022-11-16
    • 1970-01-01
    • 2018-01-26
    • 2012-09-23
    • 2014-02-27
    相关资源
    最近更新 更多