Найти тему
Блокнот математика

Рубрика "Секреты Вим". Пакетные операции

Привет, коллеги, с Вами рубрика про Вим! Сегодня обсудим пакетные операции: над многими файлами сразу.

"Настрой мне Вим и я согласна на всёёё"
"Настрой мне Вим и я согласна на всёёё"

Часто надо совершить операцию над несколькими файлами, например заменить во всех файлах проекта строку '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 переходит по кругу, так что с числом надо аккуратно.

Путеводитель по каналу и оглавление рубрики