Gnats 错误跟踪器有一个命令 (edit-pr) 可以在 $EDITOR 中打开票证。我的 $EDITOR 是 VIM,当这个命令在 $EDITOR 中打开票证时,我想自动执行一些脚本编辑,而不必进行任何额外的击键。
有没有办法编写一个可以像这样非交互式运行的 VIM 脚本?
小智 21
即使您已经收到问题的答案,其他人也可能会发现这很有用。
Vim 命令也可以在使用-s选项执行的文件中指定:
vim -s commands.txt file
Run Code Online (Sandbox Code Playgroud)
例子:
echo 'gg=G' > indent.txt
echo ':wq' >> indent.txt
vim -s indent.txt file
Run Code Online (Sandbox Code Playgroud)
这将使用 Vim 来缩进文件的内容,保存并退出。
Cal*_*leb 14
运行程序时,可以在命令行中指定 Vim 命令,如下所示:
vim file.txt "+:s/foo/bar/g"
Run Code Online (Sandbox Code Playgroud)
您可以通过添加"+[cmd]"参数来继续添加命令。您可以在那里结束,编辑器将打开,运行这些命令并等待或您,或者您可以添加一个"+:wq"来保存和关闭文件。
您还可以使用 vimscript 语法编写脚本,然后将其包装在一个函数中以在文件打开时调用,或者在单独的脚本中使用上述语法导入并应用于缓冲区。
要在非交互模式下执行 vim,您可以使用+{command}/-c {command}或-s参数,这将允许您在读取第一个文件后执行 vim 命令。
检查下面的几个例子。
使用管道的简单标准输入输出可以通过以下命令实现:
$ echo Example | vim -es '+:wq! /dev/stdout' /dev/stdin | cat
Run Code Online (Sandbox Code Playgroud)
要编辑一个文件并将更改保存到另一个文件:
$ vim -es '+:0,$s/127/128/g' '+:wq! new_file' /etc/hosts
$ cat file1 file2 | vim - -es '+:0,$s/foo/test/g' '+:wq! file3'
Run Code Online (Sandbox Code Playgroud)
要就地编辑文件,您可以使用-s {scriptin}so 读取脚本文件,例如:
$ echo ':0,$s/foo/test/ge' > cmds.txt
$ echo ':wq' >> cmds.txt
$ vim -s cmds.txt -es file
Run Code Online (Sandbox Code Playgroud)
要解析文件并将其发送到管道的输出,您可以尝试以下操作:
$ cat /etc/hosts | vim -es '+:0,$s/127/128/g' '+%print' '+:q!' /dev/stdin | cat
Run Code Online (Sandbox Code Playgroud)
或者:
$ cat /etc/hosts | vim -es '+:0,$s/127/128/g' '+:wq! /dev/stdout' /dev/stdin | cat
Run Code Online (Sandbox Code Playgroud)
查看更多:如何以非交互方式(例如在管道中)编辑文件?在 Vim SE
我从来没有使用过蚊子,所以很难说到底edit-pr要做什么。但是根据您给我们的信息,您可以尝试将 EDITOR 环境变量更改为自定义 shell 脚本,甚至可能是 python 脚本或其他脚本。
EDITOR=/path/to/script.(sh|py) edit-pr <args>
Run Code Online (Sandbox Code Playgroud)
但就像我说的,我不知道它想要什么样的编辑,或者需要在编辑器中做什么。也许您能给我们一个您想要自动化的示例?