如何从 VIM 中的字符串列表中进行替换?
我是 vim 用户,我希望在替换时能够循环一系列子字符串。我怎样才能使用一些 vim 魔法从一组这样的行转到:
Afoo
Bfoo
Cfoo
Dfoo
到
Abar
Bbar
Cbaz
Dbaz
?
我想从头开始搜索文件中下一次出现的 foo
,并将前两个实例替换为 bar
,将后两个实例替换为 baz.使用 for 循环是最好的选择吗?如果是这样,那么如何在替换命令中使用循环变量?
I am a vim user, and I want to be able to loop over a range of substrings when I am substituting. How can I use some vim magic to go from a set of lines like this:
Afoo
Bfoo
Cfoo
Dfoo
to
Abar
Bbar
Cbaz
Dbaz
?
I want to search my file from the start for the next occurance of foo
, and replace the first two instances with bar
, and the second two with baz
. Is using a for loop the best option? If so, then how do I use the loop variable in the substitution command?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(5)
我将使用一个具有状态的函数,并从 %s 调用该函数。类似于:
并将它们与以下方式一起使用:
如果您愿意,可以将对两个命令的调用封装到单个命令中。
编辑:这是一个集成为命令的版本:
:h :s_flags
) - - 为此,我们必须强制命令调用始终以 / (或任何分隔符)结束,如果不是最后一个文本被解释为标志。这是命令定义:
可以这样使用:
或者甚至考虑到初始文本:
该命令
将产生:
I would use a function that has a state, and call this function from %s. Something like:
And use them with:
The call to the two commands could be encapsulated into a single command if you wish.
EDIT: Here is a version integrated as a command that:
:h :s_flags
) -- for that, we would have for instance to impose the command call to always ends up with a / (or whatever separator-character), if not the last text is interpreted as flags.Here is the command definition:
which could be used this way:
or even, considering the initial text:
the command
would produce:
严格来说,这并不是您想要的,但对循环很有用。
我写了一个插件 swapit http://www.vim.org/scripts /script.php?script_id=2294 其中可以帮助循环遍历字符串列表。例如。
然后输入
创建一个简单的复制/粘贴行,转到最后一个单词并按 ctrl-a 交换。
然后执行交换模式
以获取
它可能适用于您的问题,尽管它的 {cword} 敏感。
This is Not strictly what you want but can be useful for cycles.
I've written a plugin swapit http://www.vim.org/scripts/script.php?script_id=2294 which among other things can help with cycling through lists of strings. Eg.
then type
create a simple yank/paste line, go to last word and ctrl-a swap.
then execute the swap pattern
to get
It could probably be applied to your problem although its {cword} sensitive.
为什么不呢:
我不确定它是否涵盖了问题的广度,但确实具有作为简单替代品的优点。如果这个解决方案不能解决,则更复杂的解决方案可能会涵盖该解决方案。
Why not:
I'm not sure that it covers the breadth of the problem but does have the virtue of being a simple substitute. A more complex one may cover the solution if this one doesn't.
这就是我尝试该宏的方式。
欢迎任何有关如何做得更好的建议。
谢谢,
马丁.
This is how I'd attempt that macro.
Any advice on how to do it better is welcome.
thanks,
Martin.
录制一个可以替换前两个的宏,然后使用 :s 来完成其余的可能会更容易。
该宏可能类似于
/foo^Mcwbar^[
。如果您不熟悉宏模式,只需按q
、a
(存储它的寄存器),然后按击键/foo即可。 cwbar
。现在,一旦您获得了该宏,请执行
2@a
来替换当前缓冲区中的前两个匹配项,并通常使用:s
来替换其余部分。It's probably going to be much easier to record a macro that can replace the first two, and then use :s for the rest.
The macro might look like
/foo^Mcwbar^[
. If you're not familiar with macro mode, just hitq
,a
(the register to store it in) and then the keystrokes/foo <Enter> cwbar <Escape>
.Now once you've got that macro, do
2@a
to replace the first two occurrences in the current buffer and use:s
normally to replace the rest.