从命令行在 Vim 中执行命令

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

我知道事实恰恰相反:

:!python %

但是,如果我想要 :retab一个文件,而不打开它在 Vim? 例如:

> vim myfile.c
:retab | wq

这将打开 myfile.c,用空格替换制表符,然后保存并关闭。我想用某种方法把这个序列连接到一个命令上。

大概是这样的:

> vim myfile.c retab | wq
45892 次浏览

这种方法是有效的:

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"

你有几个选择:

  • 将播放您在命令行中输入的 Ex 命令。
    在你的例子中: vim myfile -c 'retab | wq',这就是 Firstrock 所建议的

  • 将源给定的 vim 脚本
    (比如运行 vim -c "source 'vim source file'") :

    如果你有一个包含以下内容的 script.vim文件:

    retab
    wq
    

    然后可以使用 vim myfile.c -s script.vim(扩展名并不重要)

  • 将播放文件内容,因为它包含 正常模式命令: 如果你有 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) ,那么它就是 感染了病毒

这不是对您的问题的直接回答,但是如果您想用空格替换制表符(或者执行任何其他正则表达式搜索/替换) ,您只需使用原位 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)