🗂
CtrlP の結果を加工して挿入
Shougo/ddu.vim の使い方を調べていたら ctrlpvim/ctrlp.vim も使いこなせていないことが分かって、むしろ CtrlP の設定が捗ってしまった。その成果の一つ。
こういう情報があんまり見つからないので、もしかしたら標準機能でできるのかもしれない。
g:ctrlp_open_func
を設定すると、 CtrlP の実行後にその結果を使って実行する関数を設定できる。
vimrc#CtrlPOpenfunc
で実行する CtrlP のコマンド、 g:ctrlp_open_func
に設定する関数、CtrlP の結果の前後に追加する文字列を指定できるようにした。
vimrc#CtrlPPasteFunc
が挿入する実体の関数。
以下を書いて call execute('call vimrc#CtrlPOpenfunc("CtrlP", "vimrc#CtrlPPasteFunc", ".. image:: ")')
と実行してやると CtrlP で選択した画像ファイルで .. image:: path/to/image
(Sphinx での画像の記法) などと挿入できる。
~/vimfiles/autoload/vimrc.vim
" CtrlP で選択した内容を加工してバッファに挿入
function! vimrc#CtrlPPasteFunc(action, line) abort
call ctrlp#exit()
let backregz = getreg('z')
call setreg('z', join([s:ctrlp_affix[0], a:line, s:ctrlp_affix[1]], ''))
noautocmd normal! "zp
call setreg('z', backregz)
let g:ctrlp_open_func = {}
endfunction
function! vimrc#CtrlPOpenfunc(ctrlp, openfunc, prefix='', suffix='') abort
if exists(":" .. a:ctrlp) != 2
echohl WarningMsg | echomsg a:ctrlp .. ": 存在しないコマンドです。" | echohl None
return
endif
if exists("?" .. a:openfunc)
echohl WarningMsg | echomsg a:openfunc .. ": 存在しない関数です。" | echohl None
return
endif
let s:ctrlp_affix = [a:prefix, a:suffix]
let g:ctrlp_open_func = #{ files: a:openfunc }
execute a:ctrlp
endfunction
Discussion