検索文字列をレジスタでグローバル置換

昨日はyokohama.vim#3だったようですが、残念ながら用事があって参加登録できなかったのでvimネタ投入。

vimで単語検索をした後、その検索文字列に対して操作するということを自分はよくやります。

例えば、*で単語検索した後、ciwで単語編集したり、operator-replaceプラグインで検索単語をレジスタで置換したりなどです。
検索した他の結果に対しても同じような操作を行いたければ更に、n.n.n.・・・の用に検索、編集を繰り返し行います。
数個であればこれでもいいですが、さらに全体にグローバル置換したい場合、ここから、:%s//[置換したいレジスタ入力]/gを実行したり、マクロを使ったりする必要があり、ちょっと面倒です。

なので以下の様な関数をvimrcに追加しました。

" 検索文字列をレジスタでグローバル置換
function! s:ReplaceGlobalSearchToRegister()
  let l:reg = getreg(v:register)
  let l:cmd = '%substitute//'
  let l:opt = '/g'
  execute l:cmd . l:reg . l:opt
endfunction

nnoremap <silent> <Space>rs :<C-u>call <SID>ReplaceGlobalSearchToRegister()<CR>

検索文字列をレジスタでグローバル置換

これで、rsで"レジスタで置換、".rsで挿入したテキストで置換などができます。

オプションを変えたり、グローバルじゃなくて選択範囲を置換なども考えられますが、自分的にはとりあえずこれで十分なので、使ってくうちにもうちょっと汎用性を考えようかな。