Powerline を最新の Unite に対応させる(3日目 local_themes 追加編)


Powerline 解説記事 3 つ目です。意外と続きますね。

みんな大好き Unite ですが、最近大きな修正があり、情報がステータスラインに表示されるようになりました。

見やすくはなったんですが、これは Powerline のようにステータスラインを書き換えるプラグインとバッティングしてしまうんですね。

今回は Powerline の local_themes という機能を使ってこれに対応してみます。以下のような表示が出来れば成功です。

Unite ウィンドウの例

Unite ウィンドウの例

ただ……、この記事書いてから気付いたんですが、この件に関する修正は既に 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 が用意されています。

  1. コマンドラインウィンドウ
  2. ヘルプウィンドウ
  3. 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"
        }
    },

    ...

}

これでやっと完成です。一つ一つの修正は少ない(テーマファイル除く)んですが、結構いろいろいじんないとだめですね。

コメントを残す