There are several ways to do this.
Inside Current Directory
If you want to perform the search/replace in a project tree, you can use Vim's argument list.
Simply open Vim and then use the :args command to populate the argument list. You can pass in multiple filenames or even globs.
For example, :args **/*.rb will recursively search the current directory for ruby files. Notice that this is also like opening Vim with vim **/*.rb. You can even use the shell's find command to get a list of all files in the current directory by running:
:args `find . -type f`
You can view the current args list by running :args by itself. If you want to add or delete files from the list, you can use the :argadd or the :argdelete commands respectively.
Once you're happy with the list, now you can use Vim's powerful :argdo command which runs a command for every file in the argument list: :argdo %s/search/replace/g
Here are some tips for searching (based on some of the comments):
- Use a word boundary if you wanted to search for "foo" but not "foo_bar". Use the
\< and \> constructs around the search pattern like so: :argdo %s/\<search\>/foobar/g
- Use a
/c search flag if you want Vim to ask for confirmation before replacing a search term.
- Use a
/e search flag if you want to skip the "pattern not found" errors.
- You can also choose to save the file after performing the search:
:argdo %s/search/replace/g | update. Here, :update is used because it will only save the file if it has changed.
Open buffers
If you already have buffers open you want to do the search/replace on, you can use :bufdo, which runs a command for every file in your buffer list (:ls).
The command is very similar to :argdo: :bufdo %s/search/replace/g
Similar to :argdo and :bufdo, there is :windo and :tabdo that act on windows and tabs respectively. They are less often used but still useful to know.
/cflag for confirming substitutions. – romainl Mar 29 '15 at 11:20\<and\>around thesearchto avoid partial word replacements. – tommcdo Mar 29 '15 at 14:02:cd %:p:h. Other working directory options are listed in http://vim.wikia.com/wiki/Set_working_directory_to_the_current_file. – studgeek Jul 21 '16 at 16:37