VIM,如何在多个文件上运行一个命令

25

我有一堆Sass文件,我的设计师使用了错误的语法。我想要的是:margin-top 1px,但他写成了margin-top: 1px

所以我轻松地编写了一个子命令:

:rubydo sub! /([\w-]+):/,':\1'

这样可以解决所有冒号的问题,并将它们移动到我想要的位置。我有大约50个sass文件在一个名为stylesheets的目录中。如何一次性在所有文件上运行此命令?我不太确定如何在vim中处理这个问题。也许和grep有关?我不太清楚。

4个回答

33

对于argdo命令,我打+1. bufdo命令太笼统了。如果您不想更改全局参数列表,还可以使用:argl在窗口中创建一个参数列表。 - Greg Sexton
2
我发现这篇关于该主题的文章非常有帮助:http://www.ibrahim-ahmed.com/2008/01/find-and-replace-in-multiple-files-in.html - webdesserts

9

以下是一个示例

:bufdo %s/oldStuff/newStuff/ge | update

只需要根据你的需求修改你的正则表达式即可。


5
我认为这种情况下最好的工具是sed,即流编辑器。
sed -i.old 's/:\([-a-z]*\)/\1:/' *.css

这将编辑你所有的.css文件,并将原始文件保留为带有.old扩展名的文件。
sed使用的正则表达式集有些不同,取决于您的版本更多或更少受限制。我使用的表达式显然适用于您的情况 —— 使用BSD工具。

3
一些步骤。
:vimgrep /^[^:]\w+/ %:p:h/*    " find all of the lines that don't start with a colon

这将把所有匹配项放入您的快速修复列表中。

然后使用宏来完成您想要的操作。

qa
I:<esc>
f:x
:w|cn<enter>
q

然后测试那个宏几次(使用@a)。 再创建另一个宏来反复运行那个宏...

qbq   " this clears out b before starting, very important!
qb@a@bq
@b    " watch in amazement.  :)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接