:s
可能正确或不正确,或者我不确定是否要替换所有匹配项。有什么办法可以告诉Vim确认每一个匹配项它会在实际替换文本之前找到它?
#1 楼
除了Carpetsmoker所说的:Vim中的
&incsearch
(set incsearch
)设置真的很有用。您可以将其与一个有用的鲜为人知的技巧一起使用。技巧是仅使用
/
或?
命令来尝试使用复杂的正则表达式。 Vim将使用&incsearch
设置以交互方式显示匹配项。对正则表达式满意后,就可以使用:%s//replacement
来让vim使用以前的搜索。请注意
//
中的部分是空白的(这是您要在其中搜索文本的地方)。如果将其留空,则告诉Vim使用以前的搜索正则表达式。这样,您可以使用/
输入复杂的正则表达式,并具有set incsearch
的所有优点,然后使用%s//replacement
命令实际执行搜索和替换。如果您想要类似于incsearch for
:s
命令,签出vim-over,但我只喜欢使用本机Vim方式。#2 楼
是!对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/gc
这非常有用,但是直到2周前才知道::)它甚至在ol'vi中也可用:-)
奖金提示:您可能还想使用
:set nowrapscan
;这样可以防止Vim碰到底部时缠绕到顶部。我发现这在使用c
标志时特别有用。评论
我还要补充一点,如果要替换同一行中的old的所有实例(而不仅仅是第一次出现),则应在命令末尾添加g,这样一来,您总共将拥有%s / old / new / gc
– e271p314
20-4-19的16:53
哦耶;我已经设置了gdefault,所以我倾向于忘记在示例中添加它@ e271p314😅
–马丁·图尔诺伊(Martin Tournoij)
20-4-19在18:05
#3 楼
我最喜欢的交互式替换是使用/搜索,然后使用n进行匹配。然后使用gn选择匹配项,然后使用s用我喜欢的内容替换文本。
并移至下一场比赛并按一下。
评论
这是一个非常不错的技巧,因为它是:(1)交互式,(2)如果您不小心跳过了比赛(可以使用:s / old / new / gc不能执行的操作),则可以进行以前的比赛。
–艾拉特
18 Sep 12'在8:54
#4 楼
在Neovim中,还有一个'inccommand'
选项,可让您在键入时预览:s
命令的结果。#5 楼
为了所有人的利益,在vim8中对incsearch
进行了更新,以便在您键入模式时也显示预览
评论
我曾经使用过这样的变体:只需使用:%s / pattern / replace /,然后按u进行撤消,如果启用了hlsearch,则可以看到Vim更改的部分。您可以再次用^ R替换此文本。
–马丁·图尔诺伊(Martin Tournoij)
2015年2月5日在15:35