Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/vim/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
vim:基于一个:全局命令运行多个命令_Vim_Vi_Ex - Fatal编程技术网

vim:基于一个:全局命令运行多个命令

vim:基于一个:全局命令运行多个命令,vim,vi,ex,Vim,Vi,Ex,如果已经发布了,我表示歉意,因为我找不到答案,即使是在vim wiki上 是否有一种方法可以在vim命令行模式下,通过单个:g搜索运行多个命令 比如说, :%g/foo/ s/bar/\=@a/g | exe "norm /cat\<enter>\"ayiw" :%g/foo/s/bar/\=@a/g|exe“norm/cat\\\“ayiw” 这(对于我打算做的)应该,在匹配foo的每一行上,用registera的内容替换bar,然后找到cat的下一个迭代(即使前面有很多行),

如果已经发布了,我表示歉意,因为我找不到答案,即使是在vim wiki上

是否有一种方法可以在vim命令行模式下,通过单个
:g
搜索运行多个命令

比如说,

:%g/foo/ s/bar/\=@a/g | exe "norm /cat\<enter>\"ayiw"
:%g/foo/s/bar/\=@a/g|exe“norm/cat\\\“ayiw”
这(对于我打算做的)应该,在匹配
foo
的每一行上,用register
a
的内容替换
bar
,然后找到
cat
的下一个迭代(即使前面有很多行),并将周围的单词放入register
a

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

这个例子不是我的特定用例,但展示了这个功能非常有用的一个实例。我意识到我可以将它全部放在一个
exe
,即
%g/foo/exe“norm:s/bar/\\=@a/g\/cat\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\


我更愿意使用vanilla vim来实现这一点,但是如果有插件的话,这是一个不错的选择。有人知道有没有语法可以做这样的事情吗?

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

:let list = split(execute('g/cat/p'), '\n') | g/foo/ s/bar/\=matchstr(remove(list, 0), '\s\d\+\s\zs.*')/g
它首先读取所有出现的
cat
并将其保存在列表中。 然后将第一个
条更换为第一个cat。。。等等

脏的部分是
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>/
“s中单个大写单词的短篇小说标题
,$g/^\L\+$/s/[^A-Z0-9]\+//ge | s/\u\+/\L&/ge | s/\/\u&/ge | s/\+//ge | s/*/&/

很有趣。通常,
norm…
应该在每个匹配行上执行一次,但看起来它实际上只执行了一次。
/…/
搜索似乎导致了这一点。