我有这样一行:

function my_function(argument, another argument, but there are spaces)


我想用下划线替换空格字符(在参数名称内)。因此,我想使用:

:s/\ /_/g


,但是我如何选择不将其应用于整个行,而是从例如光标位置开始? (或第三个单词)?

评论

在正则表达式中,可以使用原子\%#来描述当前光标位置。因此,您可以使用::s / \ v(%#。*)@ <= / _ / g。可以将其描述为光标位置之后的(@ <=)字符之前的空格。

你们和Statox都提出了\%#技巧,如果您不写,我会接受他的回答。但是你们俩可以更明确地解释regexp吗?

#1 楼

您可以使用以下解决方案:

首先使用v $从光标到行尾选择文本。然后使用以下命令:

:s/\%V\ /_/g


\%V指示更改以前在视觉上选定的区域中的文本,请参阅:h /\%V

如果我以您的示例为例:

function my_function(argument, another argument, but there are spaces)


如果光标在第40列上,并且使用了我刚写的命令,我将得到:

function my_function(argument, another argument,_but_there_are_spaces)



要回答您的评论,您还可以使用



\%#,它与光标位置匹配

在第23列之后匹配的\%>23c

在标记位置之后匹配的\%>'m

请参阅:h /\%#:h /\%>c:h /\%>'m

@ User9433424在其注释中给出了一种使用\%#的方法。对于带有标记的模式,可以将其设置为ma,然后使用:

:s/\%>'a /_/g



@ User9433424给出的模式说明如下:

:s/\v(%#.*)@<= /_/
:s/                    substitution command
   \v                  Enable the very magic mode
      %#.*             Any characters from the cursor position
           @<=         Check for matches just before what follows
              space    Followed by a space
               /_/     Substitute the matches by underscores


您会希望看到:h \v:h /\@<=

评论


它工作正常!但是我不太习惯视觉选择,整个过程似乎有些“繁重”……您认为可以更快地进行一些选择吗?

– Feffe
16年6月7日在9:38

是的,让我更新我的答案:)

–statox♦
16年7月7日在9:40

User9433424在您面前给出了此提示,但是您回答了,所以如果可以的话,我将接受您的回答-您能否解释一下他使用更多的正则表达式模式?我还在为此苦苦挣扎...

– Feffe
16 Jun 7'9:49



我试图使答案尽可能清晰,但如果@ User9433424写下自己的答案,请毫不犹豫地接受它。

–statox♦
16年6月7日在10:04

正则表达式的很好的解释,谢谢!并感谢您对谁的回答发表评论:)

– Feffe
16年6月7日在10:06

#2 楼

您可以使用后向查找(:h \@<=)来确保前面有一个'(',
和一个字尾边界(:h \>)以确保替换发生在您想要的位置。

因此,输入以下文本:

function my_function(argument, another argument, but there are spaces)


运行命令:

:s/\((.*\)\@<=\> /_/g


将产生:

function my_function(argument, another_argument, but_there_are_spaces)


这可能比每次定位光标都容易,只要替换始终具有一个已知的起点即可。

评论


替换并非总是有一个已知的起点:它只是为了...纠正我所做的一系列奇怪的错字。但是,您的答案仍然很有趣,谢谢!

– Feffe
16年6月8日在10:11