从命令行在Vim中执行命令

时间:2012-02-20 18:15:18

标签: vim

无论如何都要从命令行对文件执行Vim命令吗?

我知道相反的情况是这样的:

:!python %

但是如果我想在没有在Vim中打开它的情况下:retab一个文件怎么办?例如:

> vim myfile.c
:retab | wq

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

这将是这样的:

> vim myfile.c retab | wq

3 个答案:

答案 0 :(得分:64)

这有效:

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

set et(= set expandtab)确保用正确的空格数替换tab个字符(否则retab将无效)。

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

编辑:

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

答案 1 :(得分: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),则可以记录suffers a bug

答案 2 :(得分: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)