Vimでqfreplaceと同等の置換を標準の機能で行う

Vim でqfreplaceと同等の置換をする方法について。

あるときから Vim に :cdo が追加されたので、これを使うと QuickFix のリストに対して置換ができる。

https://stackoverflow.com/a/38559267 を読んでいて発見した。

:vimgrep /search/j **/*.txt | cw
:cdo %s/search/replace/ge

これで QuickFix にある行に対して置換が実行できる。保存を同時にするなら update を追加する。

:cdo %s/search/replace/ge | update

qfreplace では置換後に保存をすると QuickFix が更新されていたが、これも以下のような関数を実行すると実現できる。

" QuickFixを更新する
function! s:update_quickfix() abort
let list = map(
\ getqflist(),
\ 'extend(v:val, { "text" : get(getbufline(v:val.bufnr, v:val.lnum), 0) })'
\ )
call setqflist(list)
endfunction
command! -nargs=0 UpdateQuickFix call <SID>update_quickfix()

ほぼそのままだが、 https://vi.stackexchange.com/a/13663 のコードをベースにした。

:cdo %s/search/replace/ge | UpdateQuickFix

いろいろと書いたが、qfreplace を手が覚えているので切り替えられる気がしない。

qfreplace が入っていない他人の Vim を使うなどといった特定の場面では役に立つかもしれない。