LoginSignup
9
10

More than 5 years have passed since last update.

:cdoと:cfdo - Quickfixの各項目に対してコマンドを実行するVimの便利コマンド

Last updated at Posted at 2016-06-17

Vim使いの紳士淑女の皆様、こんにちは。

今回はとっても便利な:cdo:cfdoコマンドについて紹介します。
バージョン7.4.858で追加されたこれらのコマンドですが、とっても便利なのです(2回目)。

日本語で紹介している記事があまり見当たらなかったため、この記事を書いてみることにしました。

どういう場面で使うか

皆さんはVimを使っている時、プロジェクト全体のファイルを検索し、一括置換したいと思ったことがありませんか?
:argsでファイルを追加して、:argdoで置換コマンド実行して~」とやってもいいのですが、:cdo:cfdoコマンドを使えば簡単に実行できます。

必要な予備知識

これらのコマンドを使う前に、vimgrepとQuickfixについて知っておく必要があります。既にQiitaに素晴らしい紹介記事がありますので説明はそちらに譲ります。
vimgrepとQuickfix知らないVimmerはちょっとこっち来い

使い方

では実際の使い方です。

まず:cdなどでプロジェクトのトップディレクトリへ移動します。そのあと
:vimgrep /hoge/ **/*.cpp | cw
といった具合に、vimgrepで検索し、その結果をQuickfixに表示します。
そこからが:cdo:cfdoの出番です。タイトルにも書きましたが、これらのコマンドはQuickfixの項目に対してコマンドを実行するというコマンドなのです。そこで、substituteコマンドとupdateコマンドを組み合わせて
:cdo %s/hoge/hige/ge | update
とやってやれば、Quickfixの全項目に対して置換を実行したあと保存してくれます。同時に保存をしたくない場合は、:set hidden後に先ほどのコマンドを| updateなしで実行するなどがいいかと思います(:set hiddenしていないと、ファイルの移動の際、「変更があるのに保存してねーぞ」と怒られます)。

どうでしょう、とっても便利ではないでしょうか。
僕は試してないですが、ack.vimなどと一緒に使うとさらに便利になるようです。

:cdoと:cfdoの違い

最後に、:cdo:cfdoの違いですが、コマンド実行後、:cdoは次のQuickfixの項目に移るのに対し、:cfdoではQuickfixの次のファイルの最初の項目に移ります。置換の場合は:cdoを使っておけば間違いはないかと思います。

参考リンク

9
10
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
10