是否可以以非交互模式执行VIM脚本?

是否可以以非交互模式执行VIM脚本?

Gnats bug 跟踪器有一个命令 (edit-pr),可以在 $EDITOR 中打开票证。我的 $EDITOR 是 VIM,当此命令在 $EDITOR 中打开票证时,我想自动执行一些脚本编辑,而无需进行任何额外的击键。

有没有办法编写一个可以像这样非交互运行的VIM脚本?

答案1

即使您已经收到问题的答案,其他人可能会发现这很有用。

Vim 命令也可以在使用以下选项执行的文件中指定-s

    vim -s commands.txt file

例子:

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

这将使用 Vim 缩进文件内容,保存并退出。

答案2

当你运行程序时,可以在命令行上指定 Vim 命令,如下所示:

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

您可以通过添加"+[cmd]"参数来不断添加命令。您可以到此结束,编辑器将打开,运行这些命令并等待,或者您可以添加一个"+:wq"来保存并关闭文件。

您还可以使用 vimscript 语法编写脚本,并将其包装在一个函数中以在文件打开时调用,或者包装在一个单独的脚本中以使用上述语法导入并应用于缓冲区。

答案3

要以非交互模式执行 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

答案4

我从来没有使用过蚊子,所以很难说到底edit-pr要做什么。但是根据您给我们的信息,您可以尝试将 EDITOR 环境变量更改为自定义 shell 脚本,甚至可能是 python 脚本或其他脚本。

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

但就像我说的,我不知道它想要什么样的编辑,或者需要在编辑器中做什么。也许您能给我们一个您想要自动化的示例?

相关内容