有时我使用带有复杂正则表达式的:s可能正确或不正确,或者我不确定是否要替换所有匹配项。

有什么办法可以告诉Vim确认每一个匹配项它会在实际替换文本之前找到它?

#1 楼

除了Carpetsmoker所说的:

Vim中的&incsearchset incsearch)设置真的很有用。您可以将其与一个有用的鲜为人知的技巧一起使用。

技巧是仅使用/?命令来尝试使用复杂的正则表达式。 Vim将使用&incsearch设置以交互方式显示匹配项。对正则表达式满意后,就可以使用:%s//replacement来让vim使用以前的搜索。

请注意//中的部分是空白的(这是您要在其中搜索文本的地方)。如果将其留空,则告诉Vim使用以前的搜索正则表达式。这样,您可以使用/输入复杂的正则表达式,并具有set incsearch的所有优点,然后使用%s//replacement命令实际执行搜索和替换。

如果您想要类似于incsearch for :s命令,签出vim-over,但我只喜欢使用本机Vim方式。

评论


我曾经使用过这样的变体:只需使用:%s / pattern / replace /,然后按u进行撤消,如果启用了hlsearch,则可以看到Vim更改的部分。您可以再次用^ R替换此文本。

–马丁·图尔诺伊(Martin Tournoij)
2015年2月5日在15:35



#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进行了更新,以便在您键入模式时也显示预览