unite.vim の action について理解する

この記事は Vim Advent Calendar 2012 308日目の記事になります。


今回は unite.vim の action について簡単に説明してみようかと思います。

[unite.vim の action とは]

action とは、unite.vim で出力される候補に対して処理を行う為の機能です。
候補を選んで、 や a を押した時に出力される一覧の機能がそれに当たります。
通常、unite.vim は選択した候補に対して action を実行する事でその候補に処理を行います。



この action は様々な場所で使用されています。
例えば、デフォルトの action(候補を選択して した時の挙動)は、

" 候補を選択して <CR> すると新しいタブページでファイルを開く
:Unite file -default-action=tabopen


のように action を指定して挙動を制御する事ができます。
上記の場合は "tabopen" が action に当たります。
unite.vim がデフォルトで用意している action は

:help unite-actions

で確認する事ができます。

[unite-kind について]

action は大きく分けて unite-source と unite-kind に属します。
unite-source はその名の通り unite-source に属する action になります。
unite-source を作成する場合にその unite-source 固有の操作を行うときに定義する事が多いです。


一方、unite-kind は、複数の action を種類ごとに1つにまとめたものになります。
例えば kind-file はファイル操作に関する action(rename や copy)があり、kind-buffer であればバッファに関する action(delete や open)があります。



↑赤い枠で囲まれた部分が kind


この unite-kind は unite-source を作成する場合に利用でき、候補に対して kind を設定することでその kind の action を使用する事ができます。
例えば、候補がファイルであれば kind-file を設定することで rename や copy などのファイル関連の action を行うことができるようになります。

[action を定義する]

action はユーザからでも定義して使用する事ができます。


と、いう事で上記のサイトにも書かれている :verbose を unite-mapping から呼び出す action を定義してみたいと思います。

let s:action = {
\   'description' : 'verbose',
\   'is_selectable' : 1,
\}

function! s:action.func(candidates)
    for candidate in a:candidates
        execute "verbose map" substitute(candidate.action__mapping, '\\\(<.*>\)', '\1', "g")
    endfor
endfunction

" kind ではなくて source の mapping に対して action を設定する
call unite#custom#action('source/mapping/*', 'verbose', s:action)
" preview(pキー)で action を実行したい場合は
" call unite#custom#action('source/mapping/*', 'preview', s:action)


こんな感じで unite-mapping に action を設定出来ました。
unite.vim は action の使い方や設定方法、拡張方法などを覚えると応用範囲がグッと広がるので活用してみるとよいと思います。