在Vim中从命令行执行命令


72

有没有办法从命令行在文件上执行Vim命令?

我知道相反的事实是这样的:

:!python %

但是,如果我想:retab在Vim中不打开文件怎么办?例如:

> vim myfile.c
:retab | wq

这将打开myfile.c,用空格替换选项卡,然后保存并关闭。我想将此序列以某种方式链接到单个命令。

就像这样:

> vim myfile.c retab | wq

Answers:


65

这有效:

gvim -c "set et|retab|wq" foo.txt

set et(= set expandtab)确保将tab字符替换为正确数量的空格(否则,retab将不起作用)。

我通常不使用它,但是vim -c ...也可以

上面给出的解决方案假定默认制表位为8是合适的。例如,如果要使制表符停止位为四个,请使用命令序列"set ts=4|set et|retab|wq"


我尝试使用xargsfind -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可以选择禁止显示该警告)。
Matthijs Kooijman

58

您有几种选择:

  • -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.txtZZ另一种方式来退出vim和保存当前的文件)。
    请注意,您可以使用来记录这些脚本vim my_file -W script.txt,但是如果您碰巧使用gvim(GUI),则会遇到一个错误


1
如果您像我一样,只想执行一些命令,则可以在某些shell中使用vim -S <(echo -e "VundleInstall \n q \n q")
Minix

2

这不是问题的直接答案,但是,如果您想用空格替换选项卡(或执行其他任何正则表达式搜索/替换)来代替文件列表,则可以仅使用就地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)

没错,您不应该像开罐器那样使用显微镜
oxfn

1
以我的经验,如果文件很大(100 MB的数量级)并且替换次数有限,那么sed会非常缓慢。@benoit建议的'vim -s <script_file>'选项要快得多-几秒。就我而言,sed花费了大约3分钟,而vim脚本选项在大约25秒内完成了,文件大小为200 MB,并进行了约100次替换
Prashant
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.