regexp在vim视觉选择中,直到最后一个选定的字符



给定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_.)@<=

(再次使用多行版本)。它使用正面向后看来确保最后一个角色仍然在视觉选择中。

最新更新