Vim での複数ファイルの一括置換については、何となく :argdo
などを使うっぽいということだけ知っていた状態で、あまり使ったことはありませんでした。
しかし、複数ファイル一括置換をするような場面に出くわし、簡単にできる方法は無いかと探していたところ、Ack.vimと qfreplaceの組み合わせが簡単そうだったので紹介します。
利用する Vim プラグインについて
Ack.vim
自分のお気に入りの検索ツール(agや ripgrepなど)による検索結果を、Quickfix ウインドウに表示してくれるプラグインです。
Quickfix ウインドウの検索結果から、対象ファイルを直接開くことも可能です。
qfreplace
Quickfix ウインドウに一覧表示されたリストを一括置換できるプラグインです。
Quickfix ウインドウのリストから置換バッファを作成し、こちらを編集・保存することで、該当のファイルを一括置換することができます。
複数ファイル一括置換の流れ
以下の流れで一括置換していきます。
- Ack.vim で検索したい文字列で検索、Quickfix ウインドウ表示
- qfreplace で Quickfix ウインドウから置換バッファウインドウ作成
- 置換バッファ内で置換
- 置換バッファを保存
- 置換を確認
手順
例として、以下では puma-devリポジトリ以下全ファイルの darwin
という文字列を、 charles
という文字列に変更する手順で書こうと思います。
環境
- Mac OS X 10.13.6
- Vim 8.1.202
0. 下準備
手順実施前に、お好みの Vim プラグインマネージャーなどを使って Ack.vim と qfreplace をインストールしておきます。
以下では dein.vim の例で記載します。
call dein#add('mileszs/ack.vim')call dein#add('thinca/vim-qfreplace')
Ack.vim で ag を使いたいという方は、ag をインストールした状態で.vimrc
に下記を追記します。
(特に変更はいらないという方は飛ばしていただいて構いません)
if executable('ag')letg:ackprg='ag --vimgrep'endif
1. Ack.vim で検索したい文字列で検索、Quickfix ウインドウ表示
それでは実施していきます。まず puma-dev リポジトリをクローンし、Vim を起動します。
$ git clone https://github.com/puma/puma-dev
$ cd puma-dev
$ vim
Vim が起動したら、:Ack darwin
と入力し実行します。
すると検索ヒットした結果が Quickfix ウインドウに表示されます。
2. qfreplace で Quickfix ウインドウから置換バッファウインドウ作成
次に、Quickfix ウインドウが開いた状態で、:Qfreplace
と入力し実行します。
すると、Quickfix ウインドウの上部にさらに qfreplace の置換バッファウインドウが開きます。
内容は Ack.vim の Quickfix ウインドウに表示された検索行がそのまま表示された形になります。
置換バッファの表示ができたら、Ack.vim の Quickfix ウインドウは閉じてもOKです。
3. 置換バッファ内で置換
qfreplace の置換バッファ内で置換を実行します。この置換バッファ内ではインサートモードで手動編集もできるのですが、今回はコマンドで置換します。
:% s/darwin/charles/g
と入力し実行します。
すると、置換バッファ内の darwin
という文字列がすべて charles
という文字列に置換されます。
4. 置換バッファを保存
最後に、置換バッファ内で、:w
を入力し保存を実行します。
すると、検索ヒットした行に該当するファイルに一括で保存処理が走り、変更が保存されます。
5. 置換を確認
最後に置換ができているかを確認してみます。
Vim を終了し、git diff
してみると、確かに置換ができていることが確認できます。
終わりに
僕はこれで気軽に複数ファイル一括置換ができるようになりました。また検索結果を確認しながら作業ができるのもいい感じです!