Можно ли выполнить сценарий VIM в неинтерактивном режиме?

8

В трекере ошибок Gnats есть команда (edit-pr), которая открывает тикет в $ EDITOR. Мой $ EDITOR - это VIM, и когда эта команда открывает тикет в $ EDITOR, я хотел бы автоматически выполнить некоторые скриптовые изменения без необходимости каких-либо дополнительных нажатий клавиш.

Есть ли способ написать сценарий VIM, который можно запустить не в интерактивном режиме, как это?

Мэтт Пфефферле
источник

Ответы:

3

Я никогда не использовал комаров, поэтому трудно сказать, что именно edit-prдолжно быть сделано. Но из того, что вы нам дали, вы можете попробовать изменить переменную EDITOR env на собственный скрипт оболочки, или, может быть, даже скрипт на python или что-то еще.

EDITOR=/path/to/script.(sh|py) edit-pr <args>

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

Falmarri
источник
Команда gnats была только примером. Я искал общее решение, и я думаю, что ваш ответ - путь. Спасибо!
Мэтт Пфефферле
20

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

Команды Vim также могут быть указаны в файле, который выполняется с помощью -sопции:

    vim -s commands.txt file

Пример:

    echo 'gg=G' > indent.txt
    echo ':wq' >> indent.txt
    vim -s indent.txt file

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

С. Кристоффер Элисен
источник
14

Команды Vim могут быть указаны в командной строке при запуске программы следующим образом:

vim file.txt "+:s/foo/bar/g"

Вы можете продолжать добавлять команды, добавляя "+[cmd]"аргументы. Вы можете либо закончить там, и редактор откроется, запустить эти команды и ждать, или вы, или вы можете добавить, "+:wq"чтобы сохранить и закрыть файл.

Вы также можете написать сценарий с использованием синтаксиса vimscript и заключить его в функцию, вызываемую при открытии файла, или в отдельный сценарий для импорта и применения к буферу, используя приведенный выше синтаксис.

Калеб
источник
5

Для выполнения VIM в не интерактивном режиме, вы можете использовать или +{command}/ -c {command}или -sпараметр , который позволит вам выполнять команды VIM после первого файла считаны.

Проверьте несколько примеров ниже.

Простой стандартный ввод и вывод с использованием каналов может быть достигнут командой:

$ echo Example | vim -es '+:wq! /dev/stdout' /dev/stdin | cat

Чтобы отредактировать один файл и сохранить изменения в другом:

$ vim -es '+:0,$s/127/128/g' '+:wq! new_file' /etc/hosts
$ cat file1 file2 | vim - -es '+:0,$s/foo/test/g' '+:wq! file3'

Чтобы редактировать файл на месте, вы можете использовать его -s {scriptin}для чтения файла сценария, например:

$ echo ':0,$s/foo/test/ge' > cmds.txt
$ echo ':wq' >> cmds.txt
$ vim -s cmds.txt -es file

Чтобы проанализировать файл и отправить его на конвейер, вы можете попробовать следующее:

$ cat /etc/hosts | vim -es '+:0,$s/127/128/g' '+%print' '+:q!' /dev/stdin | cat

или:

$ cat /etc/hosts | vim -es '+:0,$s/127/128/g' '+:wq! /dev/stdout' /dev/stdin | cat

Подробнее: Как редактировать файлы не в интерактивном режиме (например, в конвейере)? на Vim SE

kenorb
источник
Очень кстати! Любая идея, какой ресурс поддерживает пейджер Vim, например, где :hiпрокручивается и показывает -- More -- SPACE/d/j: screen/page/line down, b/u/k: up, q: quit? Он не появляется в списке буферов, и запись с записью :wприводит к пустому файлу (и нажатие клавиши 'enter' заставляет пейджер прокручиваться или выходить.) Я могу использовать :redir! >file | :hi | :redir END , который захватывает столько, сколько я прокручиваю. Я думаю, что это может работать механически, как в двух направлениях more. Я должен задаться вопросом, почему :helpи :hiне оба страничных или RO-буферизованы ...
Джон P