Vim statuslineの整え方

普段Vimの statusline は lightline.vim を使用してますが、
勉強がてら自分で作ってみました。

function! SetStatusLine()
  if mode() =~ 'i'
    let c = 1
    let mode_name = 'Insert'
  elseif mode() =~ 'n'
    let c = 2
    let mode_name = 'Normal'
  elseif mode() =~ 'R'
    let c = 3
    let mode_name = 'Replace'
  else
    let c = 4
    let mode_name = 'Visual'
  endif
  return '%' . c . '*[' . mode_name . ']%* %<%F%=%m%r %18([%{toupper(&ft)}][%l/%L]%)'
endfunction

hi User1 gui=bold guibg=red guifg=white
hi User2 gui=bold guibg=blue guifg=white
hi User3 gui=bold guibg=coral guifg=white
hi User4 gui=bold guibg=green guifg=black

set statusline=%!SetStatusLine()

解説

  • 全体概要
    • SetStatusLine関数でモードに応じて動的に色、モード名が変わるように設定
    • return文でstatuslineの設定内容を作成
  • statuslineの内容 (左から順に)
    • %[1-4]*~%*:色の設定
    • %<:長いファイルパスを短縮化
    • %F:開いているファイル名のフルパス
    • %=:左側に記載したものを左寄せ、右側に記載したものを右寄せ
    • %m:修正フラグ
    • %r:読み取り専用フラグ
    • %{toupper…}:指定文字列を大文字化
    • &ft:ファイルタイプ
    • %l:カーソルの現在行
    • %L:ファイルの全行
  • ハイライトの設定
    • hi User[1-4]:各モードに対応したハイライトを定義
    • なお guibg, guifg はGVim用の設定
    • CLIのVimでは ctermbg, ctermfg を使用

上記を設定したstatuslineがこちらです。
Normal
Insert
Visual
Replace

ご自分でstatuslineを作成する際の参考になれば幸いです。

“Vim statuslineの整え方” への 3 件のフィードバック

  1. こんにちは。
    statuslineの設定に困っていたので、すごく参考になりました。

    2点ほど質問があるですが、
    ① return文の最初と最後のシングルアポストロフィは、バックスラッシュを不要にするための物ですか?
    ②’ . c . ‘や’ . mode_name . ‘でのシングルアポストロフィとピリオドにはどういう意味があるのでしょうか?

    その他の部分は解説で理解できたのですが、上記の2点は調べても解決できなかったので、お力添えを頂けると嬉しいです。

    いいね

    1. shimasuiさん

      コメントありがとうございます。

      > ① return文の最初と最後のシングルアポストロフィは、バックスラッシュを不要にするための物ですか?

      シングルアポストロフィ (シングルクォーテーション) は文字列であることを示すために使用しています。
      なのでreturn文の最初と最期で括っているのではなく、% や *[ を文字列にする意味合いを持っています。

      > ②’ . c . ‘や’ . mode_name . ‘でのシングルアポストロフィとピリオドにはどういう意味があるのでしょうか?

      ①へのコメントの通り、シングルクォーテーションで括っているのは % や *[ といった文字列です。
      c や mode_name は変数を表します。
      また . (ドット) は前後の文字列と変数を結合する機能を持ちます。

      上記から例えばインサートモードの場合、変数cには”1″が、変数mode_nameには”Insert”が入っているため、
      return文が返す文字列は以下のようになります。

      %1*[Insert]%* %<%F%=%m%r %18([%{toupper(&ft)}][%l/%L]%)

      いいね

      1. ご回答ありがとうございます!

        なるほど、ドットを使うには、変数ではない方が文字列である必要があるから、シングルクォーテーションを使って文字列化してるんですね〜
        見返してみてすごい納得しました!

        ありがとうございました!

        いいね

コメントを残す