Как запустить серию команд 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 из командной строки.
Если это возможно, дайте мне знать, как это сделать, также, пожалуйста, дайте мне знать, как это можно делать с одним файлом во время и несколькими файлами за раз?
Ответы
Ответ 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
Это может быть полезно для более сложных взаимодействий, поскольку вы получаете полную мощность языка программирования.