假设我有一个名为StripWhitespace的函数。

我可以通过打开文件并运行:StripWhitespace在单个文件上运行它。

如何自动对文件文件夹运行该功能,并保存结果?

评论

请详细!

另请参阅:如何以非交互方式(例如在管道中)编辑文件?

#1 楼

您可以使用-c参数在启动时从vim(1)运行命令:

   -c {command}
               {command} will be executed after the first  file  has  been
               read.   {command}  is interpreted as an Ex command.  If the
               {command} contains spaces it must  be  enclosed  in  double
               quotes  (this depends on the shell that is used).  Example:
               Vim "+set si" main.c
               Note: You can use up to 10 "+" or "-c" commands.


示例:

vim -c ':call StripWhitespace()' file1 file2


要退出,请添加| :wqa

vim -c ':call StripWhitespace() | :wqa' file1 file2


评论


如果要在命令行上运行几个文件,则需要一个:argdo

–克里斯蒂安·布拉班德(Christian Brabandt)
2015年3月3日17:29



#2 楼

如果您已经在Vim中,则可以使用:argdo:bufdo命令分别对参数列表或缓冲区列表中的每个项目执行命令。

例如在参数列表中的每个文件上运行:命令:

:argdo StripWhitespace


或从缓冲区列表中的每个文件调用函数:

:bufdo call StripWhitespace()


或在参数列表中的每个文件上运行宏q

:argdo normal @q


然后可以使用:wall保存所有更改的缓冲区,或保存所有文件并使用:wqall退出Vim。

如果您想在编写过程中编写文件,则可以添加对:update的调用,如下所示:

:argdo s/foo/bar/ge | update


有多种方法可以将文件首先放入Vim,包括:


为vim命令行提供参数:vim *(这增加了将所有文件添加到参数列表),
使用:args命令(支持通配符和反引号表达式)填充参数列表,或者使用:argadd命令向其中添加文件,
只需手动将它们全部打开使用:e:Ex或文件打开插件。


评论


我喜欢这个答案,因为它不需要离开Vim,我认为这太贵了(我宝贵的缓冲区列表!)。我有一些注意事项:(1)不写就离开缓冲区需要设置“隐藏”; (2)::update命令相对于:w略有改进,因为它仅在进行更改时才写入,因此:bufdo update或:argdo update将写入所有已修改的缓冲区或参数。

–tommcdo
15年2月12日在11:10

关于更新的要点。在编写答案时,我曾考虑过提到隐藏的内容,但由于我不想过分复杂,因此决定拒绝它。经过反思,它应该在那里。我将更新答案以包含当前的两个建议。

–丰富
15年2月12日在11:18

@tommcdo刚刚检查了:wall的文档,并且只写了更改的缓冲区,因此:bufdo毕竟不需要更新。

–丰富
15年2月12日在11:20

:wall的优点,它还有一个优点是不会循环通过缓冲区并使您离开起点。我想:argdo更新仍然是另外一回事-也许您不想写入不在参数列表中的缓冲区。

–tommcdo
15年2月12日在11:44

@tommcdo好点。

–丰富
15年2月12日在11:45