Powerline 解説記事 3 つ目です。意外と続きますね。
みんな大好き Unite ですが、最近大きな修正があり、情報がステータスラインに表示されるようになりました。
見やすくはなったんですが、これは Powerline のようにステータスラインを書き換えるプラグインとバッティングしてしまうんですね。
今回は Powerline の local_themes
という機能を使ってこれに対応してみます。以下のような表示が出来れば成功です。
ただ……、この記事書いてから気付いたんですが、この件に関する修正は既に pull request されています。追っ付けメインブランチにもマージされるでしょう。
旧版である vim-powerline の場合も既に対応する記事が出ております。
unite.vim のステータスを vim-powerline で表示する – C++でゲームプログラミング
http://d.hatena.ne.jp/osyo-manga/20130429/1367235332
コード例を載せていますが、全ては例によって .config/powerline に上げておりますので、完全なものはそちらを参照してください。
local_themes
の追加
予め、config.json
には vim 用の設定として次の 3 種の local_themes
が用意されています。
- コマンドラインウィンドウ
- ヘルプウィンドウ
- quickfix ウィンドウ
ここに 4. Unite 用 の設定を付け足してみましょう。
テーマファイルの作成
まずは、このステータスラインを表現するテーマファイルを作ります。各セグメントごとに分けて設定を書いていきます。
{ "segment_data" : { "buffer_name" : { "contents" : "Unite" } }, "segments" : { "left" : [ { "type" : "string" , "name" : "buffer_name" , "highlight_group" : [ "file_name" ], "draw_soft_divider" : false }, { "name" : "unite_status_string" , "module" : "ext.vim.segments.unite" , "draw_soft_divider" : false }, { "type" : "string" , "highlight_group" : [ "background" ], "draw_soft_divider" : false , "draw_hard_divider" : false , "width" : "auto" } ], "right" : [ { "type" : "string" , "name" : "line_current_symbol" , "highlight_group" : [ "line_current_symbol" , "line_current" ] }, { "name" : "line_current" , "draw_soft_divider" : false , "width" : 3, "align" : "r" } ] } } |
unite_status_string
セグメントの追加
今回テーマで利用するセグメントのうち、 unite_status_string
だけは自分で用意しなければいけません。Unite はステータスライン文字列を unite#get_status_string()
という関数で返してくれますので、これを利用しましょう。
1 2 3 4 | from powerline.bindings.vim import vim_get_func def unite_status_string(pl): return vim_get_func( 'unite#get_status_string' )() |
vim_get_func()
というユーティリティ関数で vim 関数のインスタンスを取得し、それを実行しています。
matcher
クラスの作成
更に、次のような matcher
クラスを作成し、このクラスのメソッドが真値を返したときのみ、この local_themes
を適用することとします。
1 2 3 4 5 | import os def unite(matcher_info): name = matcher_info[ 'buffer' ].name return name and os.path.basename(name).find( '*unite*' ) = = 0 |
バッファーのファイル名が *unite*
という文字列を含む場合のみ、真値を返すようにしています。簡単ですね。
config.json
の修正
最後に、この matcher
を利用する設定を書き加えます。
"ext" : { ... "vim" : { "colorscheme" : "custom" , "theme" : "custom" , "local_themes" : { "cmdwin" : "cmdwin" , "help" : "help" , "quickfix" : "quickfix" , "ext.vim.matcher.unite" : "unite" } }, ... } |
これでやっと完成です。一つ一つの修正は少ない(テーマファイル除く)んですが、結構いろいろいじんないとだめですね。