🐈

CtrlPで選択したパスを挿入

2021/12/20に公開

Sphinx で社内に公開しているWebページに掲載するドキュメントを書いていますが画像のパス入力がちょっとメンドクサイ。

画像ファイルは _image ディレクトリ配下にあるので、 CtrlP でファイルを選択したら挿入してくれるといいのにと思い調べてみました。
g:ctrlp_open_func でエクステンションごとに実行する関数を指定できるようです。
一時的に :CtrlP を実行して選択したファイルにプレフィックス、サフィックスを付けてパスを挿入する処理を書いてみました。

~/vimfiles/autoload/vimrc.vim へ以下のようなコードを追加しています。
call vimrc#CtrlPFilenameInsert('.. image:: ', '') と実行して _image/img.png を選択すると .. image:: _image/img.png といった内容がバッファに挿入されます。

~/vimfiles/autoload/vimrc.vim 抜粋
" CtrlP で選択したファイルをバッファに挿入
function! vimrc#CtrlPPasteFunc(action, line) abort
  call setreg('9', getreg('7') .. a:line .. getreg('8'))
  call ctrlp#exit()
  normal! "zp
  call setreg('7', s:backreg7)
  call setreg('8', s:backreg8)
  call setreg('9', s:backreg9)
  let g:ctrlp_open_func = {}
endfunction
function! vimrc#CtrlPFilenameInsert(prefix, suffix) abort
  let s:backreg7 = getreg('7')
  let s:backreg8 = getreg('8')
  let s:backreg9 = getreg('9')
  call setreg('7', a:prefix)
  call setreg('8', a:suffix)
  let g:ctrlp_open_func = { 'files': 'vimrc#CtrlPPasteFunc' }
  CtrlP
  " ここで setreg('7', backreg7) などと書いても駄目。
  " CtrlP が非同期で動くため先にレジスタの値が元に戻ってしまう。
endfunction

環境

OS: Windows10
Vim: gVim Release v8.2.3848
ctrlpvim/ctrlp.vim at fc153aabd54f9189e576c9bfb07bac09f36f2ccd

GitHubで編集を提案

Discussion