web-dev-qa-db-ja.com

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

...そして含める:

set statusline+=%{ChangeStatuslineColor()} 

ただし、問題があります。insertモードに切り替えてからEscを押してnormalモードに戻っても、色は元に戻りません。手動で別のモードに入った場合にのみ、色が元に戻ります。

3
rossijonas

StatusLineハイライトグループを動的に変更することは間違ったアプローチです。これはcolorschemeのプリセットを上書きし、機能していないようです(_:redraw[status]_を追加すると役立つかもしれませんが、実装がさらに醜くなります)。

Vimでは、ステータスラインに_%#HLname#_記号を使用してカスタムハイライトグループを(複数でも)指定できます。詳細については、_:help 'statusline'_を参照してください。 _'statusline'_値を動的に変更するか(これにより、ステータスラインごとに異なる色を使用することもできます)、値自体を再評価する%!MyStatusLine()アプローチを使用できます。

0
Ingo Karkat