Обновление: У Vim теперь есть cdo
, см. Ответ Сида .
Оригинальный ответ:
Vimимеет bufdo
, windo
, tabdo
и argdo
, что позволяет выполнять одну и ту же команду во всехоткрыть буферы, окна или файлы в списке аргументов.Нам действительно нужно что-то вроде quickfixdo
, которое будет вызывать команду для каждого файла в списке быстрых исправлений.К сожалению, этой функциональности не хватает в Vim, но вот решение на Al , которое обеспечивает решение домашнего проката.Используя это, можно будет выполнить:
:QFDo %s/foo/bar/gc
И это приведет к подстановке foo / bar для всех файлов в списке быстрых исправлений.
bufdo
, windo
Команды, tabdo
и argdo
имеют некоторое общее поведение.Например, если текущий файл нельзя отменить, все эти команды не будут выполнены.Я не уверен, что указанная выше команда QFDo
соответствует тем же соглашениям.
Я адаптировал решение Ала для создания команды с именем Qargs
.Выполнение этой команды заполняет список аргументов всеми файлами, перечисленными в списке быстрых исправлений:
command! -nargs=0 -bar Qargs execute 'args ' . QuickfixFilenames()
function! QuickfixFilenames()
" Building a hash ensures we get each buffer only once
let buffer_numbers = {}
for quickfix_item in getqflist()
let buffer_numbers[quickfix_item['bufnr']] = bufname(quickfix_item['bufnr'])
endfor
return join(values(buffer_numbers))
endfunction
Используя это, вы можете выполнить следующие шаги для поиска и замены в масштабах всего проекта:
:Ggrep findme
:Qargs
:argdo %s/findme/replacement/gc
:argdo update
Редактировать: (с советами от Питера Ринкера)
Или вы можете объединить последние 3 команды вместе в одной строке:
:Ggrep findme
:Qargs | argdo %s/findme/replacement/gc | update