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 を使うなどといった特定の場面では役に立つかもしれない。