给定vim:中的这一行
The cat is sleepy.
我想用"black"代替"sleep"(当然这是为了简单起见,我实际上是在编辑C代码)
当光标位于行的开头时,我键入"/sle"使其转到"sleep"的开头
然后v,然后e
"瞌睡"一词现在已完全选定。然后我键入":s/\%V.*\%V/black/"
而不是:
The cat is black.
它给出:
The cat is blacky.
视觉上选择的最后一个字符不被视为选择的一部分,或者可能我没有正确使用\%V。
如何使模式匹配在我的视觉选择中准确地工作?
您必须在%V
:之后添加一个字符
/%V.*%V.
如果选择包含多行,则必须使用%V_.*%V_.
。
还有另一个技巧:
/%V_.{-}%V@!
(多行版本)。这利用了非贪婪匹配和负前瞻:首先({-}
)确保它只对选择进行操作,其次(@!
,特别是%V@!
)确保在最后一个字符之后没有视觉选择。
如果你有更复杂的模式,并且不能使其成为非贪婪的,或者在最后一个%V
之后放一个字符,那么还有另一种解决方案,那就是放慢速度:
/%V_.*%(%V_.)@<=
(再次使用多行版本)。它使用正面向后看来确保最后一个角色仍然在视觉选择中。