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() という関数で返してくれますので、これを利用しましょう。
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 を適用することとします。
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"
        }
    },
    ...
}
これでやっと完成です。一つ一つの修正は少ない(テーマファイル除く)んですが、結構いろいろいじんないとだめですね。


