読者です 読者をやめる 読者になる 読者になる

unite の action にショートカットを設定する

vim unite

unite では で action を選択できるけど、やっぱりよく使うものにはショートカットを設定しておいて一発で実行したい。ショートカットについては (unite_do_delete_action) などがいくつかあるが、action なんて無尽蔵に増えるし全ての action に対して が設定されているわけではないのでいっそのこと最初からこれらには頼らない方がいい。
で、action に対するショートカットを設定するには例によって FileType unite で以下のようにする。

" after/ftplugin/unite.vim
nnoremap <silent> <buffer> <C-k> :<C-u>call unite#mappings#do_action('right')<CR>
inoremap <silent> <buffer> <C-k> <ESC>:call unite#mappings#do_action('right')<CR>

…うむ。長い。何よりノーマルモードと挿入モードで割り当て先を変えないといけない。大半の人はコピペするだろうけど、初心者には分かりづらい。
なので、私は以下のような関数を定義した。

function! s:do(action)
  return printf("%s:\<C-u>call unite#mappings#do_action(%s)\<CR>",
  \             (mode() ==# 'i' ? "\<ESC>" : ''), string(a:action))
endfunction

これで、

nnoremap <silent> <buffer> <expr> <C-j> <SID>do('below')
inoremap <silent> <buffer> <expr> <C-j> <SID>do('below')

こんな風にできる。ちょっと短くなった。何より両方とも同じマッピングでわかりやすい。
この程度の関数は unite 本体に欲しいところ。名前は何でもいいんだけど、短い方が嬉しいので例えば unite#do() とか*1。無限に増える action に下手に とか設定するよりこちらの方が簡潔だと思う。

追記: unite#do_action() として取り込まれました!
http://github.com/Shougo/unite.vim/commit/4a6eddca83d623aa3ccb681ee19b02c433d5fb8b#L0R110

*1:これだと関数名から意味がわからんが、短さ優先で。