Есть несколько способов сделать это.
Внутри текущего каталога
Если вы хотите выполнить поиск / замену в дереве проекта, вы можете использовать список аргументов Vim .
Просто откройте Vim и затем используйте :args
команду для заполнения списка аргументов. Вы можете передать несколько имен файлов или даже глобусы.
Например, :args **/*.rb
будет рекурсивно искать в текущем каталоге файлы ruby. Обратите внимание, что это также похоже на открытие Vim с помощью vim **/*.rb
. Вы даже можете использовать команду оболочки, find
чтобы получить список всех файлов в текущем каталоге, выполнив:
:args `find . -type f`
Вы можете просмотреть текущий список аргументов, запустив :args
его самостоятельно. Если вы хотите добавить или удалить файлы из списка, вы можете использовать команды :argadd
или :argdelete
.
Как только вы довольны списком, теперь вы можете использовать мощную :argdo
команду Vim, которая запускает команду для каждого файла в списке аргументов::argdo %s/search/replace/g
Вот несколько советов по поиску (на основе некоторых комментариев):
- Используйте границу слова, если вы хотите найти «foo», но не «foo_bar». Используйте
\<
и \>
конструкции вокруг шаблона поиска следующим образом::argdo %s/\<search\>/foobar/g
- Используйте
/c
флаг поиска, если вы хотите, чтобы Vim запросил подтверждение перед заменой поискового запроса.
- Используйте
/e
флаг поиска, если хотите пропустить ошибки «шаблон не найден».
- Вы также можете сохранить файл после выполнения поиска:
:argdo %s/search/replace/g | update
. Здесь :update
используется, потому что он сохранит файл, только если он изменился.
Открытые буферы
Если у вас уже открыты буферы, для которых вы хотите выполнить поиск / замену, вы можете использовать :bufdo
команду, которая запускает команду для каждого файла в вашем списке буферов ( :ls
).
Команда очень похожа на :argdo
: :bufdo %s/search/replace/g
Аналогично :argdo
и :bufdo
, есть :windo
и :tabdo
то, что действует на окнах и вкладках соответственно. Они используются реже, но все же полезно знать.
/c
флаг для подтверждения замен.\<
и\>
во всем,search
чтобы избежать частичной замены слов.:cd %:p:h
. Другие параметры рабочего каталога перечислены в vim.wikia.com/wiki/Set_working_directory_to_the_current_file .Допустим, у нас есть простая структура проекта, подобная этой:
Приветствие выглядит так
и info / age.txt выглядит так
Допустим, мы хотим заменить все вхождения Сэма на Боба. Вот что мы будем делать:
Установить рабочий каталог
Убедитесь, что текущий рабочий каталог Vim является корневым для проекта (здесь вам не покажут, как это сделать).
Найти файлы, которые содержат «Сэм»
Используйте команду Vim vimgrep для поиска всех вхождений Сэма в проекте (примечание:
**/*
рекурсивный поиск во всех файлах)Это заполнит список быстрых исправлений всеми экземплярами Сэма. Если вы хотите просмотреть список быстрых исправлений, вы можете использовать команду Vim
:copen
Заменить во всех файлах, которые содержат «Сэм»
Теперь мы хотим запустить команду замены Vim внутри каждого файла в списке быстрых исправлений. Мы можем сделать это, используя
:cfdo {cmd}
команду, которая выполняет {cmd} в каждом файле в списке быстрых исправлений. Конкретный {cmd}, который мы хотим использовать, этоsubstitute
илиs
для краткости. Полная строка будет выглядеть так:Вы можете добавить флаг c, чтобы подтвердить все замены, если хотите:
Сохранить все файлы
источник
cfdo %s/Sam/Bob/g | update
зафиксировано , что для меняhidden
опцию,:set hidden
если вы еще этого не сделали.Хотя это не решение VIM, если вы используете VI / VIM, вам может оказаться проще использовать решение CLI. Чтобы изменить все файлы в текущем каталоге, используйте,
perl
как это было сделано для ситуаций, подобных этой:Если вам нужно сделать это и в подкаталогах, я обычно соединяюсь
perl
сfind
:Приятно то, что вы можете легко уточнить список для конкретных типов файлов. Например, чтобы ограничиться файлами Python:
источник
Чтобы заменить фразу другой, вы можете использовать режим Vim Ex.
Например (
ex
псевдонимvim -E
):Рекурсивно в bash / zsh (с
globstar
установленным, напримерshopt -s globstar
):Рекурсивно (используя
find
и игнорируя скрытые файлы, такие как.git
файлы):Примечание:
:bufdo
команда не POSIX .Примечание. Синтаксис
-not -path '*/\.*'
используется для игнорирования скрытых файлов (например,.git
).источник
Вот команда shell с использованием
find
иex
редактор (без использования:bufdo
):Это позволит отредактировать все
*.rb
файлы в текущей папке (рекурсивно) и заменитьfoo
наbar
.источник