有时我使用:s
复杂的正则表达式,它可能正确也可能不正确,或者不确定是否要替换所有匹配项。
我有什么办法可以告诉Vim在实际替换文本之前确认找到的所有匹配项?
有时我使用:s
复杂的正则表达式,它可能正确也可能不正确,或者不确定是否要替换所有匹配项。
我有什么办法可以告诉Vim在实际替换文本之前确认找到的所有匹配项?
Answers:
是! 将c
标志用于:substitute
。来自:help substitute
:
[c] Confirm each substitution. Vim highlights the matching string (with
hl-IncSearch). You can type: :s_c
'y' to substitute this match
'l' to substitute this match and then quit ("last")
'n' to skip this match
<Esc> to quit substituting
'a' to substitute this and all remaining matches {not in Vi}
'q' to quit substituting {not in Vi}
CTRL-E to scroll the screen up {not in Vi, not available when
compiled without the +insert_expand feature}
CTRL-Y to scroll the screen down {not in Vi, not available when
compiled without the +insert_expand feature}
用法示例很简单:
%s/old/new/c
这非常有用,但是直到2周前才知道:-)它甚至在ol'vi中也可用:-)
温馨提示:您可能还想使用:set nowrapscan
; 这样可以防止Vim碰到底部时缠绕到顶部。我发现这在使用标志时特别有用c
。
除了Carpetsmoker所说的:
的 &incsearch
set incsearch
Vim中()设置非常有用。您可以将其与一个有用的鲜为人知的技巧一起使用。
诀窍是仅使用/
or ?
命令来尝试复杂的正则表达式。Vim将使用&incsearch
设置以交互方式显示匹配项。对正则表达式满意后,就可以使用:%s//replacement
vim来使用以前的搜索。
请注意,其中的部分//
是空白的(在此处您可以搜索文本)。如果您将其留空,则告诉Vim使用以前的搜索正则表达式。有了它,您可以输入一个复杂的正则表达式,/
并具有以下所有优点set incsearch
,然后使用%s//replacement
命令实际执行搜索和替换。
如果您想要类似于incsearch的:s
命令,请查看vim-over,但我只喜欢使用本机Vim方式。
我最喜欢的交互式替换是使用搜索/并使用进行匹配n。
然后选择使用匹配gn,然后s以替代与任何我喜欢的文字。
并重复进行至下一场比赛并按.
:s/old/new/gc
),则可以进行上一场比赛。
在Neovim中,还有一个'inccommand'
选项可以让您:s
在键入命令时预览命令的结果。
为了所有人的利益,incsearch
在vim8中进行了更新,以便在您键入模式时也显示预览
:%s/pattern/replace/
然后按u
undo,就可以看到Vim更改的部分(如果已hlsearch
启用)。您可以再次用替换此文本^R
。