🗂

CtrlP の結果を加工して挿入

2023/01/09に公開

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
GitHubで編集を提案

Discussion