Подтвердить что ты не робот

Как запустить серию команд vim из командной строки

У меня есть четыре текстовых файла A.txt, B.txt, C.txt и D.txt Я должен выполнить серию редактирования vim во всех этих файлах. В настоящее время, как я делаю, открывается каждый файл и выполняет одни и те же команды vim один за другим.

Можно ли создать файл script, который я могу запустить из командной строки, означает, что без открытия фактического файла для редактирования vim.

например, если мне нужно выполнить приведенные ниже команды vim после открытия файла A.txt в редакторе vim:

:g/^\s*$/d
:%s/^/[/
:%s/\(.*\)\(\s\+\)\(.*\)/\3\2\1
:%s/$/]/
:%s/design/test/

Можно ли создать файл script и поместить все эти команды, включая gvim A.txt (первая команда в файле). и отредактируйте, запустите файл script из командной строки.

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

4b9b3361

Ответ 1

vim -c <command> Execute <command> after loading the first file

Делает то, что вы описываете, но вам придется делать это по одному файлу за раз.

Итак, в оболочке windows...

for %a in (A,B,C,D) do vim -c ":g/^\s*$/d" -c "<another command>" %a.txt

Оболочки POSIX аналогичны, но в настоящий момент у меня нет машины.

Я предполагаю, что вы можете сразу загрузить все файлы и сделать это, но для этого потребуется повторить команды в командной строке vim для каждого файла, похожие на

vim -c "<command>" -c "<command>" -c ":n" (repeat the previous -c commands for each file.)  <filenames go here>

EDIT: 08 июня 2014 года: Просто FYI, я обнаружил это несколько минут назад.

vim имеет команду bufdo для выполнения операций с каждым буфером (файлом), загруженным в редактор. Посмотрите на документы для команды bufdo. В vim, :help bufdo

Ответ 2

Количество команд -c, непосредственно переданных в Vim в командной строке, ограничено 10, и это не очень читаемо. Кроме того, вы можете поместить команды в отдельный script и передать это Vim. Вот как:

Тихий пакетный режим

Для очень простой обработки текста (например, с помощью Vim, такого как расширенный "sed" или "awk", возможно, просто воспользовавшись расширенными регулярными выражениями в команде :substitute), используйте Ex-mode.

REM Windows
call vim -N -u NONE -n -es -S "commands.ex" "filespec"

Примечание: тихий пакетный режим (:help -s-ex) запутывает консоль Windows, поэтому вам может понадобиться выполнить cls для очистки после запуска Vim.

# Unix
vim -T dumb --noplugin -n -es -S "commands.ex" "filespec"

Внимание: Vim будет в ожидании ввода, если файл "commands.ex" не существует; лучше проверить заранее за его существование! В качестве альтернативы, Vim может читать команды от stdin. Вы также можете заполнить новый буфер текстовым чтением из stdin и прочитать команды из stderr, если используете аргумент -.

Полная автоматизация

Для более продвинутой обработки, включающей несколько окон, и реальной автоматизации Vim (где вы можете взаимодействовать с пользователем или оставлять Vim, чтобы позволить пользователю захватить), используйте:

vim -N -u NONE -n -c "set nomore" -S "commands.vim" "filespec"

Здесь приведено краткое описание используемых аргументов:

-T dumb           Avoids errors in case the terminal detection goes wrong.
-N -u NONE        Do not load vimrc and plugins, alternatively:
--noplugin        Do not load plugins.
-n                No swapfile.
-es               Ex mode + silent batch mode -s-ex
                Attention: Must be given in that order!
-S ...            Source script.
-c 'set nomore'   Suppress the more-prompt when the screen is filled
                with messages or output to avoid blocking.

Ответ 3

Со всеми командами, которые вы хотите запускать для каждого файла, сохраненного в script, скажем "script.vim", вы можете выполнить это script в одном файле, как это (как указывали другие):

vim -c "source script.vim" A.txt

Сделав этот шаг дальше, вы можете сохранить свой файл в конце script, либо поместив команду :w внутри самого script, либо передав ее из командной строки:

vim -c "source script.vim | w" A.txt

Теперь вы можете запускать любую команду в Vim для нескольких файлов, используя команду argdo. Таким образом, ваша команда превращается в:

vim -c "argdo source script.vim | w" A.txt B.txt C.txt D.txt

Наконец, если вы хотите выйти из Vim после запуска script в каждом файле, просто добавьте еще одну команду для выхода:

vim -c "argdo source script.vim | w" -c "qa" A.txt B.txt C.txt D.txt

Ответ 4

Попробуйте использовать следующий синтаксис:

ex foo.txt <<-EOF
  g/^\s*$/d
  %s/^/[/
  %s/\(.*\)\(\s\+\)\(.*\)/\3\2\1
  %s/$/]/
  %s/design/test/
  wq " Update changes and quit.
EOF

Команда ex эквивалентна vim -E. Добавьте -V1 для подробного вывода.

Альтернативный синтаксис с одним слоем - это, например:

ex +"g/^\s*$/d" +"%s/^/[/" +"%s/design/test/" -cwq foo.txt

Чтобы загрузить команды из файла, используйте -s cmds.vim.

Вы также можете использовать shebang для Vim для анализа файла из аргумента.

Дополнительные примеры см. в разделе

Ответ 5

JimR и Ingo предоставили отличные ответы для вашего случая использования.

Чтобы добавить еще один способ сделать это, вы можете использовать мой плагин vimrunner для script взаимодействия в ruby: https://github.com/AndrewRadev/vimrunner.

Пример:

vim = Vimrunner.start

vim.edit "file.txt"
vim.insert "Hello"
vim.write

vim.kill

Это может быть полезно для более сложных взаимодействий, поскольку вы получаете полную мощность языка программирования.