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