function my_function(argument, another argument, but there are spaces)
我想用下划线替换空格字符(在参数名称内)。因此,我想使用:
:s/\ /_/g
,但是我如何选择不将其应用于整个行,而是从例如光标位置开始? (或第三个单词)?
#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
评论
在正则表达式中,可以使用原子\%#来描述当前光标位置。因此,您可以使用::s / \ v(%#。*)@ <= / _ / g。可以将其描述为光标位置之后的(@ <=)字符之前的空格。你们和Statox都提出了\%#技巧,如果您不写,我会接受他的回答。但是你们俩可以更明确地解释regexp吗?