【问题标题】:Execute a command within Vim from the command line从命令行在 Vim 中执行命令
【发布时间】:2012-02-20 18:15:18
【问题描述】:

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

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

:!python %

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

> vim myfile.c
:retab | wq

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

应该是这样的:

> vim myfile.c retab | wq

【问题讨论】:

    标签: vim


    【解决方案1】:

    这行得通:

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

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

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

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

    【讨论】:

    • 我尝试使用xargs (find -name \*.[ch] | xargs -n 1 vim -c "set et|retab|wq") 在多个文件上运行它,但这真的很慢。在每次调用时,vim 都会抱怨输入不是来自终端,我认为它会延迟一两秒钟以允许阅读消息。或者,for 循环保持标准输入不变,因此速度很快:for f in $(find -name \*.[ch]); do vim -c "set et|retab|wq" $f; done。但是,这并不完美,例如带有空格或太多文件名的文件名会破坏这一点(所以也许 vim 可以选择禁止该警告)。
    【解决方案2】:

    您有多种选择:

    • -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

    【讨论】:

    • 如果你和我一样只想执行一些命令,在某些 shell 中你可以使用vim -S <(echo -e "VundleInstall \n q \n q")
    【解决方案3】:

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

    【讨论】:

    • 你是对的 - 不应该像开罐器一样使用显微镜
    • 根据我的经验,如果文件很大(大约 100 MB)并且替换的数量有限,那么 sed 会非常缓慢。 @benoit 建议的 'vim -s ' 选项工作得更快 - 以秒为单位。就我而言,sed 大约需要 3 分钟,而对于 200 MB 大的文件和大约 100 次替换,vim 脚本选项在大约 25 秒内完成
    猜你喜欢
    • 1970-01-01
    • 2011-05-05
    • 2012-07-15
    • 2017-07-04
    • 1970-01-01
    • 2013-09-22
    • 2011-06-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多