Вот полная последовательность команд, которую я бы использовал:
/stringiwanttoreplace
:vimgrep /<c-r>// **
:Qargs
:argdo %s//newstring/g
:argdo update
В первой строке мы ищем целевой шаблон.Это заполняет последний регистр шаблона поиска (:help quote/
), что означает, что нам не придется вводить его снова полностью.
Команда :vimgrep
ищет весь проектдля указанного шаблона.Введите <c-r>/
как ctlr + r , а затем / - это вставляет содержимое последнего регистра шаблона поиска в командную строку.Первый и последний символы /
являются разделителями для поля поиска.Трейлинг **
говорит Vim заглянуть внутрь каждого файла и каталога под текущим каталогом.
На этом этапе список быстрых исправлений будет заполнен поисковыми совпадениями из всех соответствующих файлов.: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
Добавьте это к вашему vimrc
файлу.
После запуска :Qargs
наш список аргументов должен теперь содержать все файлы, которые включают нашу целевую строку.Таким образом, мы можем запустить команду подстановки с :argdo
, чтобы выполнить команду в каждом файле.Мы можем оставить поле поиска команды замещения пустым, и оно будет автоматически использовать самый последний шаблон поиска.Если вы хотите, вы можете включить флаг c
при запуске команды замещения, тогда вам будет предложено подтвердить.
Наконец, команда :argdo update
сохраняет каждый файл, который был изменен.
Как указал @ Peter Rincker , вы должны убедиться, что опция Vim's 'hidden' включена, иначе она вызовет ошибку при попытке переключиться на другой буфер перед тем, какзапись любых изменений в активный буфер.
Также обратите внимание, что последние 3 команды могут быть выполнены в одной командной строке, разделив их символом канала.
:Qargs | argdo %s//replacement/gc | update
Команда :Qargs
взята из этого ответа (мной), который, в свою очередь, был вдохновлен этим ответом DrAl .Очень подобное решение было опубликовано @ ib , что подсказывает мне, что Vim должен действительно реализовать что-то вроде :quickfixdo
изначально.