Nithin Bekal About

Vim: Search and replace across all project files

25 May 2019

TLDR: The grep and cfdo commands let you easily perform search and replace across all files in a project. To replace the string original_string with new_string, run this in command mode.

:grep original_string
:cfdo %s/original_string/new_string/g | write

Although I’ve been using Vim for years, I keep forgetting the exact commands to perform a search and replace across all project files, and keep having to look it up.

Let’s walk through what exactly is going on in the two commands listed above.

:grep original_string

The first command is easy enough - grep searches for the given string across all files in the project and loads the results into a quickfix list. You can look at the results by opening the quickfix window using :copen.

:cfdo %s/original_string/new_string/g | write

The cfdo command is a fairly recent addition to Vim - it was only introduced in Vim 7.4. It runs the given command on each file in the quickfix list.

The command being executed is pretty simple. The first part is a typical vim substitute command. The bar (|) is the separator character in vim - it lets us execute two commands in a single line. write is the same as doing :w in command mode. (You could also abbreviate that to w there.)

Hi, I’m Nithin! This is my blog about programming. Ruby is my programming language of choice and the topic of most of my articles here, but I occasionally also write about Elixir, and sometimes about the books I read. You can use the atom feed if you wish to subscribe to this blog or follow me on Mastodon.