Выполнение команд VIM в сценарии оболочки

Я пишу сценарий bash, который запускает программу командной строки (Gromacs), сохраняет результаты, изменяет входные файлы и затем снова обрабатывает процесс. Я пытаюсь использовать VIM для изменения входных текстовых файлов, но я не смог найти способ выполнить внутренние команды VIM, такие как: 1234, w, x, dd, ect. из файла.sh после открытия моих входных файлов в VIM ("vim conf.gro").

Есть ли какой-либо практический способ выполнения команд VIM из сценария оболочки?

Ответ 1

Я думаю, что vim -w/W and vim -s - это то, что вы ищете.

"Операции vim/последовательность клавиш", которые вы могли бы записать с помощью vim -w test.keys input.file также могли бы написать test.keys. например, сохранить в файле:

ggwxjddZZ

это будет делать:

move to 1st line, 
move to next word,
delete one char,
move to next line, 
del the line. 
save and quit.

с этим файлом test.keys вы можете сделать:

vim -s test.keys myInput.file

ваш "myInput.file" будет обработан вышеуказанными операциями и сохранен. вы можете использовать эту строку в своем сценарии оболочки.

vimgolf использует тот же способ, чтобы сохранить решение пользователей.

Ответ 2

Вы можете -c скрипт Vim через флаг -c.

vim  -c "set ff=dos" -c wq mine.mak

Однако это только доводит вас до сих пор.

  • Из команд, которые вы дали, похоже, что вы пытаетесь запустить некоторые обычные команды. Вам нужно будет использовать :normal. например :norm dd
  • Написание всего этого в командной строке вызывает проблемы. Я предлагаю вам сделать ВИМ - файл (например, commands.vim), а затем :source через -S.
  • Вы, вероятно, хотите получить хорошие и совместимые команды vim ex. Взгляните на :h ex-cmd-index

Таким образом, вы получите что-то вроде этого. Со всеми вашими командами vim внутри commands.vim.

vim -S commands.vim mine.mak

Вы также можете посмотреть на использование sed и/или awk для обработки текста.

Ответ 3

альтернативы

Если вам действительно не нужны специальные возможности Vim, вам, вероятно, лучше использовать неинтерактивные инструменты, такие как sed, awk или Perl/Python/Ruby/ваш любимый язык сценариев.

Тем не менее, вы можете использовать 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 выполнить 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.