vim - 根据模式设置状态行颜色的最佳方法是什么

ros*_*nas 7 vim

我试图改善我的 vim 体验,试图在每次模式更改时更改 vim 状态行颜色。

我试过这个:(在这里找到)

    "Automatically change the statusline color depending on mode
function! ChangeStatuslineColor()
  if (mode() =~# '\v(n|no)')
    exe 'hi! StatusLine ctermfg=008'
  elseif (mode() =~# '\v(v|V)' || g:currentmode[mode()] ==# 'V·Block' || get(g:currentmode, mode(), '') ==# 't')
    exe 'hi! StatusLine ctermfg=005'
  elseif (mode() ==# 'i')
    exe 'hi! StatusLine ctermfg=004'
  else
    exe 'hi! StatusLine ctermfg=006'
  endif

  return ''
endfunction
Run Code Online (Sandbox Code Playgroud)

...包括:

set statusline+=%{ChangeStatuslineColor()} 
Run Code Online (Sandbox Code Playgroud)

但是有一个问题,如果你切换到插入模式,然后按 Esc 键回到正常模式,它不会改变颜色。只有当您手动进入不同的模式时,它才会变回颜色。

was*_*asd 8

很抱歉进行 necroposting,但我想我为这项任务找到了更好的解决方案。像这样设置所需的颜色

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
Run Code Online (Sandbox Code Playgroud)

现在添加到状态行

set statusline+=%#NormalColor#%{(mode()=='n')?'\ \ NORMAL\ ':''}
set statusline+=%#InsertColor#%{(mode()=='i')?'\ \ INSERT\ ':''}
set statusline+=%#ReplaceColor#%{(mode()=='R')?'\ \ REPLACE\ ':''}
set statusline+=%#VisualColor#%{(mode()=='v')?'\ \ VISUAL\ ':''}
Run Code Online (Sandbox Code Playgroud)

它工作完美,不需要任何视觉模式的解决方法,也不需要额外的光标移动来触发颜色变化。