Let's say you want to do a refactoring in your Scala project and replace all occurrences of new LocalDate(2020, 10, 1) with DateTime(2020, 10, 1).
Search for what you want to match in your local file to try to find the right query
/\vnew LocalDate\((.{-})\) \v activates regex search as you would expect it, we capture the exact date in a capture group and .{-} makes the . match non-greedy compared to .* which would not stop at the first )Find all files containing new LocalDate(...)
:vimgrep // **/*.scala find all occurrences in files which match the // last executed search and writes these into the quickfix list. **/*.scala matches all .scala files, regardless where in the project.:Rg pattern and then alt - a or Tab and Shift - Tab to select wanted matches, Enter to send to quickfix list.Run the replacing over all files
:cfdo %s//DateTime(\1)/gc applies the substitute command to each item in the quickfix list. %s starts the substitute command, // again is the last used search and DateTime(\1) is the replacement, where \1 is the first capture group, so e.g. 2020, 10, 1. /gc says we want to apply it to each occurrences in a line and c lets you view and accept the replacement, it can be left out. It can be useful to chain a update with :cfdo %s//DateTime(\1)/gc | update, which ensures all changed files are saved.Sometimes you want to do some refactoring to many files, so you record a macro qq in the current file, and want to apply that to other files as well:
Add all files you want to apply the macro to the args list
argadd ./src/stuff/*.md:GFiles and then Tab and Shift + Tab select wanted files and hit Ctrl - l (custom function see **) to add to args list. Check that the args list is correct
argsApply the macro to all files
argdo normal @q | update**
" Populates the args list with file search results from fzf
func s:fnameescape(key, val)
  return fnameescape(a:val)
endfunc
function! s:populate_arg_list(lines)
  execute 'args ' . join(map(a:lines, function('s:fnameescape')), ' ') 
endfunction
let g:fzf_action = { 'ctrl-l': function('s:populate_arg_list') }