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