Как запустить функцию или макрос в папке с файлами?

12

Допустим, у меня есть функция с именем StripWhitespace.

Я могу запустить его на одном файле, открыв файл и запустив его :StripWhitespace.

Как я могу автоматически запустить эту функцию для папки с файлами и сохранить результаты по мере продвижения?

squarefrog
источник
3
Подробности, пожалуйста!
200_success

Ответы:

10

Вы можете использовать -cаргумент для запуска команды при запуске из vim(1):

   -c {command}
               {command} will be executed after the first  file  has  been
               read.   {command}  is interpreted as an Ex command.  If the
               {command} contains spaces it must  be  enclosed  in  double
               quotes  (this depends on the shell that is used).  Example:
               Vim "+set si" main.c
               Note: You can use up to 10 "+" or "-c" commands.

Пример:

vim -c ':call StripWhitespace()' file1 file2

Чтобы выйти потом, добавьте | :wqa:

vim -c ':call StripWhitespace() | :wqa' file1 file2
Мартин Турной
источник
1
Вы хотите: argdo, если вы запустите это для пары файлов в командной строке
Кристиан Брабандт
19

Если вы уже находитесь в Vim, вы можете использовать команды :argdoили :bufdoдля выполнения команды для каждого элемента в списке аргументов или списке буферов соответственно.

например, запустить :команду для каждого файла в списке аргументов:

:argdo StripWhitespace

Или для вызова функции из каждого файла в списке буферов:

:bufdo call StripWhitespace()

Или запустить макрос qдля каждого файла в списке аргументов:

:argdo normal @q

Затем вы можете сохранить все измененные буферы с помощью :wallили сохранить все и выйти из Vim с помощью :wqall.

Если вы хотите записывать файлы по ходу дела, вы можете добавить вызов :update, например, так:

:argdo s/foo/bar/ge | update

Существует множество способов, с помощью которых вы можете получить файлы в Vim, в том числе:

  • Задайте параметры в командной строке vim: vim *(это добавит все файлы в список аргументов),
  • Используйте :argsкоманду (которая поддерживает символы подстановки и обратные выражения), чтобы заполнить список аргументов, или :argaddкоманду, чтобы добавить файлы к нему,
  • Просто откройте их все вручную :e, :Exили файл-открытия плагина.
Богатый
источник
1
Мне нравится этот ответ, потому что он не требует выхода из Vim, что, на мой взгляд, слишком дорого (мой драгоценный буферный список!). У меня есть некоторые замечания: (1) оставляя буфера без записи требует , 'hidden'чтобы установить; (2) : updateкоманда небольшое улучшение по сравнению , :wпоскольку он пишет только если изменение было сделано, так :bufdo updateили :argdo updateзапишет все измененные буферы или аргументы.
tommcdo
Хорошая точка update. Я считал , упоминая , hiddenкогда я писал ответ, но решил против него , потому что я не хочу усложнять его. Хотя, если подумать, он должен быть там. Я обновлю ответ, чтобы включить оба предложения в настоящее время.
Рич
@tommcdo Только что проверил документацию на: wall, и он записывает только измененные буферы, так что: обновление bufdo в конце концов не нужно.
Рич
хороший улов относительно того :wall, что также имеет преимущество в том, что не перебирает буферы и не перемещает вас от того, с чего вы начали. Я предполагаю, что :argdo updateэто все еще другая история - может быть, вы не хотите писать в буферы, которых нет в вашем списке аргументов.
Tommcdo
@tommcdo Хороший вопрос.
Богатый