レジスタについて
レジスタはヤンクや削除を行った際に対象の文字列を保存しておく領域のことを指します。細かい説明は省きますが、デフォルトで保存される「無名レジスタ」や直近の削除したものがスタックされていく「番号付きレジスタ」、クリップボードと連携される「クリップボードレジスタ」など色々なレジスタが存在します。
:registers
か:reg
のExコマンドでレジスタの一覧を表示することが出来ます。またヤンクやペーストをする際に各レジスタを指定することで狙ったレジスタに保存したり、ペーストすることが出来るのです。
fzfで参照したい
一見便利そうなレジスタですが種類が多過ぎてどこに何を保存しているのか分からなくなることがあります。という訳でfzfと組み合わせてレジスタを曖昧検索で参照して貼り付け出来るようにしたいと思います。
fzfが何か分からない方はこちらをご覧下さい。
最終的に下図の様なものになります。
※この後作成するコマンドを実行するとレジスタの検索窓が表示されて選択すると貼付けされるイメージ
Vim script
早速Vim scriptを書いていきます。Vim script自体の作り方についてはこの辺りをご確認下さい。下記のコードを記述してから:FzfPaste
そして:FzfShiftPaste
を実行してください。
"" 後方に貼り付け
command! FzfPaste :call s:FzfPaste()
function! s:FzfPaste()
let reg = execute(":reg")
let regs = split(reg, "\n")
call remove(regs, 0)
call fzf#run({'source': regs, 'sink': funcref('s:write'), 'down': '25%'})
endfunction
func! s:write(s) abort
execute ':norm ' . strcharpart(a:s,5,2) . 'p'
endfunc
"" 前方に貼り付け
command! FzfShiftPaste :call s:FzfShiftPaste()
function! s:FzfShiftPaste()
let reg = execute(":reg")
let regs = split(reg, "\n")
call remove(regs, 0)
call fzf#run({'source': regs, 'sink': funcref('s:write'), 'down': '25%'})
endfunction
func! s:write(s) abort
execute ':norm ' . strcharpart(a:s,5,2) . 'P'
endfunc
先程の画像の様な検索窓が表示されて、それぞれ前後に選択したレジスタの内容がペーストされれば成功です。
※不慣れなもので冗長・不備のあるコードかと思いますがご容赦下さい。
キーマッピング
適当に衝突しなさそうなキーマッピングを登録しました。参考にしてみて下さい。
:nnoremap <Leader>p :FzfPaste<CR>
:nnoremap <Leader>o :FzfShiftPaste<CR>
以上です。
終わりに
今回はVim Awesomeにレジスタを管理するのに丁度良いプラグインが無かったので自分で作ってみました。勉強がてらプラグインにしてみるのも面白そうだなと思いましたが、別プラグイン(fzf.vim)に依存している点があまり良くないので断念してしまいました。