作者が教える! lightline.vimの設定方法! 〜 初級編 - コンポーネントを作ってみよう

この記事では、lightline.vimの設定について教えます。インストールに困っている人、前回の記事(作者が教える! lightline.vimの導入・設定方法! 〜 初級編 - インストールしよう - プログラムモグモグ)を読んでいない人はそちらから読んで下さい。

この記事の最初は、何も設定をしていない状態から話を進めます。

用語の説明

lightline.vimのドキュメントでは、いくつかの言葉をlightline.vimの特定の機能を指すために使用しています。少し用語の説明をしたいと思います。

コンポーネント (component)

構成要素という意味です。lightline.vimでは、ステータスラインの要素のこと指します。

例えば上の画像では、左側に2つのコンポーネント、右側に5つのコンポーネントが表示されています。

コンポーネントの集合 (component group)

コンポーネントを集めたものです。lightline.vimでは、隣接するコンポーネントたちをまとめて一つと勘定したものを意味します。

例えば上の画像では、左側に2つのコンポーネント集合、右側に3つのコンポーネント集合が表示されています。あるコンポーネント集合に含まれるコンポーネントは、全て同じ色になります。

コンポーネントを理解する

デフォルトの設定で無名バッファーを開くと、次のようになります。

ここで左側に着目しましょう。見えているのは、

の二つです。
何か編集してみて下さい。

「+」記号が現れましたね。

ここで、次のコマンドでヘルプファイルを開いてみましょう。

:help


ROという記号が現れました。

更に、次のコマンドでpasteモードにします。

:set paste

コンポーネントを集めたものをコンポーネント集合といいますので

となります。これらは同じ色付けがされています。


いちいち「モードのコンポーネント」やら「バッファーを編集したこと...」と書くのは長いので、lightline.vimでは全てのコンポーネントに名前が付けられています。今まで出てきたコンポーネントの名前は次のようになっています。

  • NORMAL: 'mode'
  • PASTE: 'paste'
  • RO: 'readonly'
  • [No Name]: 'filename'
  • -: 'modified'

コンポーネント集合は2つあります

  • ['mode', 'paste']
  • ['readonly', 'filename', 'modified']

即ち、コンポーネント集合をまとめると、左側のステータスラインは次のように書けます。

  • [ ['mode', 'paste'], ['readonly', 'filename', 'modified'] ]

もう一度このスクリーンショットを見てみましょう。

対応関係がはっきりすると思います。

g:lightlineを設定してコンポーネントをいじってみる

lightline.vimの設定は、全て辞書型変数g:lightlineに書きます。例えば、設定ファイル.vimrcに次の設定を書きます。

let g:lightline = {
      \ 'active': {
      \   'left': [ ['mode', 'paste'], ['readonly', 'filename', 'modified'] ]
      \ }
      \ }


何も変わりません。

'filename'と'readonly'コンポーネントを逆にしてみます。

let g:lightline = {
      \ 'active': {
      \   'left': [ ['mode', 'paste'], ['filename', 'readonly', 'modified'] ]
      \ }
      \ }


逆になりました!

コンポーネントを作ってみる

lightline.vimは、ユーザーにコンポーネントを作ってもらうことを推奨しています。そのために、コンポーネントを簡単に作れる仕組みがあります。

まず、`Hello, world!`と常に表示するコンポーネントを作ってみます。

let g:lightline = {
      \ 'active': {
      \   'left': [ ['hello', 'mode', 'paste'], ['readonly', 'filename', 'modified'] ]
      \ },
      \ 'component': {
      \   'hello': 'Hello, world!'
      \ }
      \ }


無事、一番左に追加されました。もちろん、何度も使えます。

let g:lightline = {
      \ 'active': {
      \   'left': [ ['hello', 'mode', 'paste'], ['hello', 'readonly', 'filename', 'modified'], ['hello'] ]
      \ },
      \ 'component': {
      \   'hello': 'Hello, world!'
      \ }
      \ }


Hello, world!が増殖を始めたようです...この例から分かるように、各コンポーネントと、それの文字の色、背景の色は、全く関連がありません。何番目のコンポーネント集合の中に使われるかで、その色に溶け込んでしまいます。特殊な色付けを行うには、少しややこしいことをしなくていはいけませんので、次々回か次々々回くらいに置いておきます。

コンポーネント集合を三つ以上使った時は、もう色がありませんので、最後のコンポーネント集合に付け足されます。

let g:lightline = {
      \ 'active': {
      \   'left': [ ['hello', 'mode', 'paste'], ['hello', 'readonly', 'filename', 'modified'], ['hello'], ['hello'], ['hello'] ]
      \ },
      \ 'component': {
      \   'hello': 'Hello!'
      \ }
      \ }


もしカラースキームがもっといくつも色を持っていれば、それが使われます。

関数でコンポーネントを作ってみる

`g:lightline.component`でコンポーネントを作るのは簡単ですが、もっとややこしいことをやろうとすると、一行で書けなくなったりします。
そこで、lightline.vimコンポーネントは関数で書けるようになっています。
`g:lightline.component_function`に関数の名前を登録します。
先ほどの'hello'コンポーネントを関数で定義すると、次のようになります。

let g:lightline = {
      \ 'active': {
      \   'left': [ ['hello', 'mode', 'paste'], ['readonly', 'filename', 'modified'] ]
      \ },
      \ 'component_function': {
      \   'hello': 'LightlineHello'
      \ }
      \ }
function! LightlineHello()
  return 'Hello, world!'
endfunction

次に、幅が狭くなったら'hello'コンポーネントを隠すようにしましょう。LightlineHello関数を次のようにします。

function! LightlineHello()
  if winwidth(0) > 70
    return 'Hello, world!'
  else
    return ''
  endif
endfunction


自動的に隠れますね! ばんざい!

lightline.vimが既に用意しているコンポーネントも、ユーザーが挙動を変更することが出来ます。
例えば、unite.vim, vimshellやvimfilerでは、プラグインの名前をモードのところに表示したくなったとします。
そんな時は次の設定を使います。

let g:lightline = {
      \ 'active': {
      \   'left': [ ['mode', 'paste'], ['readonly', 'filename', 'modified'] ]
      \ },
      \ 'component_function': {
      \   'mode': 'LightlineMode'
      \ }
      \ }
function! LightlineMode()
  return  &ft == 'unite' ? 'Unite' :
        \ &ft == 'vimfiler' ? 'VimFiler' :
        \ &ft == 'vimshell' ? 'VimShell' :
        \ winwidth(0) > 60 ? lightline#mode() : ''
endfunction


ここまでくれば、作者が教える! lightline.vimの導入・設定方法! 〜 初級編 - インストールしよう - プログラムモグモグに書いた例も読めると思います。

今回はここまで。特にcomponent_functionの使い方を学んで下さい。

lightline.vimでは、ユーザーにどんどん設定を書いてもらうという姿勢をとっています。まず、カラースキームを変更することをユーザーに促し、私の設定と称してそのままコピーしてもらいます。そこから、思い通りでないところはユーザーに編集してもらうのです。それを通して、Vim scriptに慣れてもらうこと、Vimの設定をどんどん書いていく(つまり.vimrcの行数が長くなっていく)楽しさを感じてもらうことを目的としています。