vim 搜索和替换仅限于可视块模式下的高亮
Posted
技术标签:
【中文标题】vim 搜索和替换仅限于可视块模式下的高亮【英文标题】:vim search and replace limited to the highlight in visual block mode 【发布时间】:2011-09-07 23:58:47 【问题描述】:我经常在列中有文本,需要替换一些东西而不破坏同一行上的类似内容......一个简单的例子如下:
假设我已经用 vim 可视块模式将文本高亮显示为灰色,并且想将 80
替换为 81
;但是,我只希望在突出显示的可视块内进行替换。
我已经尝试过 Cntlv : s/80/81/g
;但是,这会替换视觉块内部和外部的文本。 (根据 Randy 的反馈,这是因为 : s
是逐行命令)。
我知道我可以在这个特定实例中使用逐行可视块替换(Shiftv : s/80\.1/81.1/g
);但是,我正在尝试为无法在非逐行可视块中替换的问题找到一个通用的解决方案(这不是可视块模式应该帮助解决的那种问题吗?)。像: s/80/81/gc
这样需要确认的答案不是我想要的。
为了清楚起见,我将重申这个问题:如何使用 vim 的可视块模式突出显示将 80
替换为 81
?
【问题讨论】:
仅供参考...对于那些在 MS Windows 下使用gvim
的人,可视块模式是 <cntl-q>
,因为 <cntl-v>
粘贴复制缓冲区
【参考方案1】:
视觉选择块should可以用%V识别
:'<,'>s/\%V80/81/g
【讨论】:
【参考方案2】:您需要将\%V
添加到您的模式中。来自:help \%V
:
Match inside the Visual area. When Visual mode has already been
stopped match in the area that gv would reselect.
This is a /zero-width match. To make sure the whole pattern is
inside the Visual area put it at the start and end of the pattern.
OP EDIT:明确的解决方案是使用: s/\%V8\%V0/81/g
【讨论】:
正是我想要的;有趣的是,我在逐行块模式下不需要\%V
。
因为 ':s' 是逐行操作。添加它的好处是,即使您离开了视觉模式,您仍然可以在模式中使用 '\%V' 对最后一个视觉选择进行操作。
为了理解这一点,我将 \%
视为正则表达式转义字符,将 ` and
V` 视为 \b
中的 b
用于单词边界,其中 \%V
是选择。
@YzmirRamirez 这种理解\%V
的方式是完全不正确的。 \%V
是一个零宽度的原子,它与 inside 视觉选择相匹配。如果您选择一个字符(例如1
)并使用\%V1\%V
,您将看到不匹配,因为第二个字符不在选择范围内。此外,如果在选择时使用\%V2
是 边界123
将不匹配2
。
@MikePennington 出于上述原因,您的编辑不正确。正确的正则表达式是 \%V8\%V0
,not \%V80\%V
.【参考方案3】:
解决方案显然是 \%V 正则表达式原子,但请注意,这仍然有点错误。
更新:这不是错误。这个thread 解释了这种行为。
【讨论】:
感谢您的回复。您在\%V
中看到过什么样的错误行为?
@ChristianBrabandt 如果您 a)说 \%V
在正则表达式中匹配(请参阅我对已接受答案的评论)并且 b)删除或未证实上述评论指出 @ 987654324@ 不是零宽度。 // 我认为是您的编辑使这个问题出现在 RSS 中。以上是关于vim 搜索和替换仅限于可视块模式下的高亮的主要内容,如果未能解决你的问题,请参考以下文章