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


8

Gnats错误跟踪程序有一个命令(edit-pr),可在$ EDITOR中打开故障单。我的$ EDITOR是VIM,当此命令在$ EDITOR中打开故障单时,我想自动执行一些脚本编辑,而不必进行任何其他的击键。

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

Answers:


3

我从来没有使用过gna子,所以很难说到底该怎么edit-pr做。但是,根据您提供的信息,您可以尝试将EDITOR env变量更改为自定义外壳脚本,甚至可能是python脚本或其他内容。

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

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


gnats命令只是一个示例。我一直在寻找一个通用的解决方案,我认为您的答案是正确的方法。谢谢!
Matt Pfefferle 2011年

20

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

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

    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


非常便利!任何想法都支持Vim的寻呼机的资源,例如:hi可滚动显示的位置-- More -- SPACE/d/j: screen/page/line down, b/u/k: up, q: quit吗?它不会出现在缓冲区列表中,用:ww写入将写入一个空文件(并且“ enter”键会导致分页器滚动或退出。)我可以使用:redir! >file | :hi | :redir END ,它捕获的内容与滚动一样多。我认为它可能像2向机械地工作more。我想知道为什么:help而且:hi都没有页面缓冲或都没有RO缓冲...
John P
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.