unite.vim の action を定義する

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


さて、unite.vim なのですが unite-menu などで候補を Vim のコマンドとして実行する事ができます。
この時にコマンドを実行するとそのコマンドがコマンド履歴に追加されます。
しかし、この時に履歴に残ってほしくない場合もあります。
と、いう事で『コマンドを実行した時に履歴に追加しない』ような unite.vim の action を定義してみました。

[ソース]

" action を定義
" 今回は kind ではなくて action 単体を定義する
" action の設定などはこの辞書に記述する
" 設定できる項目は
" :help unite-kind-attribute-action_table
" を参照
let s:action = {
\   'is_selectable' : 0,
\}

" action の挙動を処理する
" 引数の candidate は選択された候補のデータである
" また candidate は
" 'is_selectable' : 0 の場合は、辞書
" 'is_selectable' : 1 の場合は、辞書のリスト
" になる
function! s:action.func(candidate)
    " 'action__command' は unite-source 側で設定されている情報
    " この action を使用したいのであれば
    " unite-source 側で action__command を設定しておく必要がある
    let command = a:candidate.action__command
    let type = get(a:candidate, 'action__type', ':')
    try
        execute type . command
    catch /E486/
        " Ignore search pattern error.
    endtry
endfunction


" kind に action を追加する
" 今回は kind-command に対して action を追加する
" これで kind-command が設定されている候補に対して
" この action が使用できるようになる
call unite#custom#action('command', 'non_history_execute', s:action)
unlet s:action


" kind-command の default action を今回定義した action に設定する
" これで候補を決定(候補を選択して<CR>)した時に
" この action が呼び出される
call unite#custom#default_action('command', 'non_history_execute')


このようにして unite.vim の action を定義することができます。
既存の action を変更したい場合や新しい action を追加したい場合に有効なので色々と試してみるといいと思います。