有没有办法从命令行在文件上执行Vim命令?
我知道相反的事实是这样的:
:!python %
但是,如果我想:retab
在Vim中不打开文件怎么办?例如:
> vim myfile.c
:retab | wq
这将打开myfile.c,用空格替换选项卡,然后保存并关闭。我想将此序列以某种方式链接到单个命令。
就像这样:
> vim myfile.c retab | wq
Answers:
您有几种选择:
-c "commands"
:将在您在命令行中输入Ex命令时播放它们。
在您的例子:vim myfile -c 'retab | wq'
。这就是Firstrock的建议。
-S "vim source file"
:将提供给定的vim脚本
(如运行vim -c "source 'vim source file'"
):
如果您的文件script.vim
包含:
retab
wq
然后就可以使用了vim myfile.c -s script.vim
(扩展名并不重要)
-s "scriptin file"
:将播放文件的内容,因为它包含普通模式命令:如果您有script.txt
包含:
:retab
ZZ
使用由单个的行结束^M
字符(例如保存使用脚本:set fileformat=mac | w
),那么你可以运行:vim myfile.c -S script.txt
(ZZ
另一种方式来退出vim和保存当前的文件)。
请注意,您可以使用来记录这些脚本vim my_file -W script.txt
,但是如果您碰巧使用gvim(GUI),则会遇到一个错误。
vim -S <(echo -e "VundleInstall \n q \n q")
。
这不是问题的直接答案,但是,如果您想用空格替换选项卡(或执行其他任何正则表达式搜索/替换)来代替文件列表,则可以仅使用就地sed搜索/替换:
sed -i 's/\t/ /g' foo1.txt foo2.txt
要么
ls *.txt | xargs sed -i 's/\t/ /g'
(在此示例中,我将每个制表符替换为三个空格。)
注意:-i
标志意味着就地操作。
从sed
手册页:
-i[SUFFIX], --in-place[=SUFFIX]
edit files in place (makes backup if extension
supplied)
xargs
(find -name \*.[ch] | xargs -n 1 vim -c "set et|retab|wq"
)在多个文件上运行此命令,但这确实很慢。在每次调用时,vim都会抱怨输入不是来自终端的,我认为这可能会延迟一到两秒钟才能读取消息。另外,for循环使stdin保持不变,因此速度很快:for f in $(find -name \*.[ch]); do vim -c "set et|retab|wq" $f; done
。但是,这不是完美的,例如,文件名中包含空格或文件名过多会破坏这种情况(因此vim可以选择禁止显示该警告)。