繁体   English   中英

vim:根据一个:global命令运行多个命令

[英]vim: Run multiple commands based off of one :global command

抱歉,如果已经发布,因为即使在vim Wiki上也找不到答案。

有没有一种方法可以通过单个:g搜索以vim命令行模式运行多个命令?

例如,

:%g/foo/ s/bar/\=@a/g | exe "norm /cat\<enter>\"ayiw"

在与foo匹配的每一行上,哪一行(针对我打算执行的操作)应将bar替换为寄存器a的内容, 然后找到cat的下一个迭代(即使前面有很多行),并在其周围加上单词登记a

取而代之的是,此特定语法使用首字母为a寄存器的当前内容来完成替换命令,然后在一行上执行普通模式命令(替换完成后)。

这个示例不是我的特定用例,而是显示了一个实例,其中该功能很有用。 我意识到我可以将所有内容放到一个exe ,即%g/foo/exe "norm :s/bar/\\\\=@a/g\\<enter>/cat\\<enter>\\"ayiw" ,但是我想第一种方法,因为我觉得它更灵活。


我更喜欢使用Vanilla Vim来执行此操作,但是如果存在用于此功能的插件,那是一个不错的选择。 有人知道是否有语法可以做这种事情吗?

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

: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解决方案感兴趣,不必成为一个单一的人)。

您可以执行此操作(至少对于应用于一个:g的多个:s命令而言)。 例:

" SHORT STORY TITLES to single word of CapitalizedWords within <h3>s
.,$g/^\L\+$/s/[^A-Z0-9 ]\+//ge|s/\u\+/\L&/ge|s/\<\l\+\>/\u&/ge|s/ \+//ge|s/.*/<h3>&<\/h3>/

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM