Привет, коллеги, с Вами рубрика про Вим! Сегодня обсудим пакетные операции: над многими файлами сразу.
Часто надо совершить операцию над несколькими файлами, например заменить во всех файлах проекта строку '3.14' на 3.1415' (это шутка такая, если кто не понял). Если надо в проекте заменить wtf69 на latent_heat_flux, а переменную b заменить на wtf, и это в 42 файлах... то читайте дальше!
Конечно, можно сказать
perl -pi.bak -E 's/\b3\.14\b/3.1415/g' *.c
и обойтись без Вима. Но это заметка про Вим.
Файлы надо открыть — просто списком 'arglist' или во вкладках. И пройтись по ним. Опишем сначала, как пройтись по вкладкам.
Команда называется tabdo. Перед ней можно указать диапазон вкладок, а после указывается команда. Команда может быть конвейерной: с помощью |
Например,
:tabdo :%s/\<3\.14\>/3.1415/g | w!
Нельзя открывать и закрывать вкладки, а также менять их порядок. Ошибка останавливает процесс. Вкладка с ошибкой или последняя по счету становится текущей.
Аналогично работает windo: по окнам в текущей вкладке; а также и argdo: по файлам в списке аргументов (если попроще, там список файлов, открытых в Вим командой vim file1 file2 file3).
Единственное, что надо либо сохранить файл, либо поставить восклицательный знак: argdo! — иначе команда не переключится на следующий файл, если текущий изменился. Польза от этой команды: практически нет ограничений. Хоть все файлы в системе обрабатывай.
Полезная вещь — это конвейер |. Это не конвейер в смысле UNIX, а последовательное выполнение команд, как && в bash. Можно, например, выполнить две замены подряд, а не приключаться с хитрым выражением, чтобы выполнить всё за один раз. Или сохранить файл.
Для этого есть команда udate, которая сохраняет файл, только если он изменялся.
Кроме того, можно сделать то же макросом:
- 1gt — переход на первую вкладку;
- qq — запись макроса в регистр q;
- все, что угодно, кроме q и изменения вкладок;
- gt — переход на вкладку вправо;
- q — окончание записи;
- @q — прогон макроса;
- 42@@ — прогон последнего макроса сколько надо раз. Надо только учесть, что gt переходит по кругу, так что с числом надо аккуратно.
Путеводитель по каналу и оглавление рубрики