Выполнение команд 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.