2017-07-29 176 views
4

道歉,如果这已经发布,因为我找不到答案,即使在vim wiki上也是如此。vim:运行基于一个命令的多个命令:全局命令

有没有一种方法可以在vim命令行模式下运行多个命令关闭一个:g搜索?

例如,

:%g/foo/ s/bar/\[email protected]/g | exe "norm /cat\<enter>\"ayiw" 

哪个(什么,我想让它做)应该在每一行匹配foo,更换bar与寄存器a的内容,然后找到的下一个迭代cat(即使前面有很多行),并将周围的单词放入寄存器a

而是,此特定语法使用初始a寄存器的当前内容完成替换命令,然后在一行(在替换完成后)上执行正常模式命令。

此示例不是我特定的用例,但显示了此功能有用的一个实例。我意识到我可以把它全部放入一个exe,即%g/foo/exe "norm :s/bar/\\[email protected]/g\<enter>/cat\<enter>\"ayiw",但我想这样做的第一种方式,因为我觉得它更灵活。


我宁愿做这个用香草vim的,但如果一个插件存在这一点,这是一个不错的选择。有人知道是否有语法来做这样的事情吗?

+1

有趣。通常,每个匹配行上应该执行一次'规范...',但它看起来好像只能执行一次。 '/.../'搜索似乎会导致这种情况。 –

回答

1

好吧,有点“脏”,但这对你有用吗?

:let list = split(execute('g/cat/p'), '\n') | g/foo/ s/bar/\=matchstr(remove(list, 0), '\s\d\+\s\zs.*')/g 

它首先读取cat所有出现保存在列表中。 然后用第一只猫替换第一个bar ...等等。

脏部分是matchstr命令。在g//p也返回一个数字的结果,所以列表如下:

1 cat 
2 cat 
3 cat 
... 

,这就是为什么我们必须拆掉了一下。我很想听听是否有人知道一个干净的解决方案(我也对一个干净的vimscript解决方案感兴趣,并不一定是一个oneliner)。