在Vim中从命令行执行一个命令

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

我知道相反的是这样的:

:!python % 

但是如果我想要:retab在Vim中打开文件而不用打开文件呢? 例如:

 > vim myfile.c :retab | wq 

这将打开myfile.c,用空格replace标签,然后保存并closures。 我想以某种方式将这个序列链接到一个单一的命令。

这将是这样的:

 > vim myfile.c retab | wq 

这对我工作:

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

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

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

你有几个select:

  • -c "commands" :将在命令行中input命令时播放Ex命令。
    在你的例子中: vim myfile -c 'retab | wq' vim myfile -c 'retab | wq' 。 这就是Firstrock所build议的。

  • -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.txtlogging这些脚本,但是如果您碰巧使用gvim(GUI),则会遇到一个bug 。

不是直接回答你的问题,但如果你想用空格replace标签(或做任何其他正则expression式search/replace)的文件列表,你可以使用就地sedsearch/replace:

 sed -i 's/\t/ /g' foo1.txt foo2.txt 

要么

 ls *.txt | xargs sed -i 's/\t/ /g' 

(在这个例子中,我用三个空格replace每个制表符。)


注: -i标志表示就地操作。

sed手册页:

  -i[SUFFIX], --in-place[=SUFFIX] edit files in place (makes backup if extension supplied)