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

dhxwm5r4  于 2022-11-11  发布在  其他
关注(0)|答案(5)|浏览(178)

我一直试图改善我的vim体验,试图有vim状态线的颜色,以改变每次模式的变化。
我发现了这个:(找到here

"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

...包括:

set statusline+=%{ChangeStatuslineColor()}

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

h5qlskok

h5qlskok1#

很抱歉发布了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

现在添加到状态行

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

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

lqfhib0f

lqfhib0f2#

我发现下面的方法对我来说是最好的。它为我提供了所有不同模式的颜色,而不仅仅是插入,替换,视觉和正常。

function! GitBranch()
  return system("git rev-parse --abbrev-ref HEAD 2>/dev/null | tr -d '\n'")
endfunction

function! StatuslineGit()
  let l:branchname = GitBranch()
  return strlen(l:branchname) > 0?'  '.l:branchname.' ':''
endfunction

let g:currentmode={
      \ 'n'  : 'n',
      \ 'v'  : 'v',
      \ 'V'  : 'vl',
      \ '' : 'vb',
      \ 'i'  : 'i',
      \ 'R'  : 'r',
      \ 'Rv' : 'rv',
      \ 'c'  : 'c',
      \ 't'  : 'f',
      \}

hi NormalColor ctermbg=black ctermfg=white
hi InsertColor ctermbg=darkgreen ctermfg=black
hi ReplaceColor ctermbg=darkred ctermfg=black
hi VisualColor  ctermbg=darkblue ctermfg=black

set laststatus=2
set statusline=
set statusline+=%#NormalColor#%{(g:currentmode[mode()]=='n')?'\ \ normal\ ':''}
set statusline+=%#InsertColor#%{(g:currentmode[mode()]=='i')?'\ \ insert\ ':''}
set statusline+=%#ReplaceColor#%{(g:currentmode[mode()]=='r')?'\ \ replace\ ':''}
set statusline+=%#ReplaceColor#%{(g:currentmode[mode()]=='rv')?'\ \ v-replace\ ':''}
set statusline+=%#VisualColor#%{(g:currentmode[mode()]=='v')?'\ \ visual\ ':''}
set statusline+=%#VisualColor#%{(g:currentmode[mode()]=='vl')?'\ \ v-line\ ':''}
set statusline+=%#VisualColor#%{(g:currentmode[mode()]=='vb')?'\ \ v-block\ ':''}
set statusline+=%#NormalColor#%{(g:currentmode[mode()]=='c')?'\ \ command\ ':''}
set statusline+=%#NormalColor#%{(g:currentmode[mode()]=='f')?'\ \ finder\ ':''}
set statusline+=%#PmenuSel#
set statusline+=%{StatuslineGit()}
set statusline+=%#Statusline#
set statusline+=\ %f
set statusline+=%m
set statusline+=%=
set statusline+=%#StatusLineNc#
set statusline+=\ %y
set statusline+=\ %{&fileencoding?&fileencoding:&encoding}
set statusline+=\ %p%%
set statusline+=\ %l:%c
vatpfxk5

vatpfxk53#

也许你应该试试这个vim插件vim-airline。它可以根据你设置的颜色主题自动改变状态线的颜色。

nfs0ujit

nfs0ujit4#

我喜欢有两个vim配置,一个使用插件,另一个只有一个vimrc。要做到这一点,没有插件,如航空公司,我通常使用以下代码片段:http://vim.wikia.com/wiki/Change_statusline_color_to_show_insert_or_normal_mode

function! InsertStatuslineColor(mode)
  if a:mode == 'i'
    hi statusline guibg=magenta
  elseif a:mode == 'r'
    hi statusline guibg=blue
  else
    hi statusline guibg=red
  endif
endfunction

au InsertEnter * call InsertStatuslineColor(v:insertmode)
au InsertChange * call InsertStatuslineColor(v:insertmode)
au InsertLeave * hi statusline guibg=green

" default the statusline to

进入Vim hi状态时为绿色,guibg=绿色
正如维基上所述:
当你进入插入模式和离开插入模式时,下面的一小段代码会改变状态线的颜色。没有Map键或新命令需要记住,它完全自动工作。
当然,如果您不喜欢所选的颜色,您可以更改以下内容:
guibg=洋红色

dphi5xsq

dphi5xsq5#

我知道这个问题是问了很久以前,你可能会得到你想要的,但无论如何,我会张贴我的解决方案,在我看来是足够好,在这里分享它.

hi StatusLine           ctermfg=253         ctermbg=233         cterm=bold
hi StatusLineNormal     ctermfg=251         ctermbg=26          cterm=bold
hi StatusLineInsert     ctermfg=251         ctermbg=22          cterm=bold
hi StatusLineReplace    ctermfg=251         ctermbg=88          cterm=bold
hi StatusLineVisual     ctermfg=251         ctermbg=130         cterm=bold
hi StatusLineVisualL    ctermfg=251         ctermbg=130         cterm=bold
hi StatusLineVisualB    ctermfg=251         ctermbg=130         cterm=bold
hi StatusLineCommand    ctermfg=251         ctermbg=26          cterm=bold
hi StatusLineSelect     ctermfg=251         ctermbg=130         cterm=bold
hi StatusLineSelectL    ctermfg=251         ctermbg=130         cterm=bold
hi StatusLineSelectB    ctermfg=251         ctermbg=130         cterm=bold
hi StatusLineTerminal   ctermfg=251         ctermbg=22          cterm=bold

let s:statusline_modes_dict = {
    \ 'n' : {
        \ 'text'        : 'NORMAL',
        \ 'color_group' : 'StatusLineNormal'
    \ },
    \ 'i' : {
        \ 'text'        : 'INSERT',
        \ 'color_group' : 'StatusLineInsert'
    \ },
    \ 'R' : {
        \ 'text'        : 'REPLACE',
        \ 'color_group' : 'StatusLineReplace'
    \ },
    \ 'v' : {
        \ 'text'        : 'VISUAL',
        \ 'color_group' : 'StatusLineVisual'
    \ },
    \ 'V' : {
        \ 'text'        : 'V-LINE',
        \ 'color_group' : 'StatusLineVisualL'
    \ },
    \ "\<C-v>" : {
        \ 'text'        : 'V-BLOCK',
        \ 'color_group' : 'StatusLineVisualB'
    \ },
    \ 'c' : {
        \ 'text'        : 'COMMAND',
        \ 'color_group' : 'StatusLineCommand'
    \ },
    \ 's' : {
        \ 'text'        : 'SELECT',
        \ 'color_group' : 'StatusLineSelect'
    \ },
    \ 'S' : {
        \ 'text'        : 'S-LINE',
        \ 'color_group' : 'StatusLineSelectL'
    \ },
    \ "\<C-s>" : {
        \ 'text'        : 'S-BLOCK',
        \ 'color_group' : 'StatusLineSelectB'
    \ },
    \ 't' : {
        \ 'text'        : 'TERMINAL',
        \ 'color_group' : 'StatusLineTerminal'
    \ },
\ }

function Get_current_mode_text ()
    let md = mode()
    if (has_key (s:statusline_modes_dict, md))
        return s:statusline_modes_dict[md]['text']
    endif
    return md
endfunction

function Get_current_mode_color_group ()
    let md = mode()
    if (has_key (s:statusline_modes_dict, md))
        return "%#" . s:statusline_modes_dict[md]['color_group'] . "#"
    endif
    return "%#StatusLine#"
endfunction

" left
set statusline=
set statusline+=%{%Get_current_mode_color_group()%}\ 
set statusline+=%{Get_current_mode_text()}\ 
set statusline+=%#Statusline#\

这里,statusline_modes_dict存储key,这些keymode()返回的内容完全相同,并且text将显示在状态行和突出显示组中(color_group),当然必须将其添加到配色方案中,或者别的什么地方。也许有可能合并Get_current_mode_text()Get_current_mode_color_group()到一个单一的功能,以减少操作,但我没有使它在一个状态行工作。

相关问题