この記事では、lightline.vimの設定について教えます。インストールに困っている人、前回の記事(作者が教える! lightline.vimの導入・設定方法! 〜 初級編 - インストールしよう - プログラムモグモグ)を読んでいない人はそちらから読んで下さい。
この記事の最初は、何も設定をしていない状態から話を進めます。
用語の説明
lightline.vimのドキュメントでは、いくつかの言葉をlightline.vimの特定の機能を指すために使用しています。少し用語の説明をしたいと思います。
コンポーネントを理解する
デフォルトの設定で無名バッファーを開くと、次のようになります。
ここで左側に着目しましょう。見えているのは、
の二つです。
何か編集してみて下さい。
「+」記号が現れましたね。
ここで、次のコマンドでヘルプファイルを開いてみましょう。
:help
- NORMAL: モードのコンポーネント
- RO: ファイルが読み込み専用であることを表すのコンポーネント
- [No Name]: ファイル名のコンポーネント
- -: バッファーを編集したこと(+)、編集できないこと(-)を表すコンポーネント
更に、次のコマンドでpasteモードにします。
:set paste
- NORMAL: モードのコンポーネント
- PASTE: ペーストモードのコンポーネント
- RO: ファイルが読み込み専用であることを表すのコンポーネント
- [No Name]: ファイル名のコンポーネント
- -: バッファーを編集したこと(+)、編集できないこと(-)を表すコンポーネント
コンポーネントを集めたものをコンポーネント集合といいますので
となります。これらは同じ色付けがされています。
いちいち「モードのコンポーネント」やら「バッファーを編集したこと...」と書くのは長いので、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の行数が長くなっていく)楽しさを感じてもらうことを目的としています。