2009-12-16 59 views
10

可能重复:
Case preserving substitute in VimVIM:如何保存的情况下搜索和替换

是否有可能做一个搜索,并在vim,保留搜索项的情况下更换?这是我错过的intelliJ中的一个有用功能。

举例来说,像这样:

:s/[uU]ser/[pP]erson/ (obviously, this doesn't work) 

这样的:

user->person 
User->Person 

与多个字符又如保存:

:s/[mM]y[uU]ser/[tT]his[pP]erson/g 

这样的:

myuser->thisperson 
myUser->thisPerson 
MyUser->ThisPerson 

回答

7

有可以采取一些办法。如果你想坚持的基本Vim的功能,你可以这样做

:%s/[uU]ser/\=submatch(0) ==# 'user' ? 'person' : 'Person'/g 

如果你的Vim建有Perl绑定,您可以利用:perldo。根据匹配/替换单词的长度以及要保留的情况,这可能会也可能不会。

:perldo s/(user)/"\L$1"^$1^'person'/ieg 

或者你可以利用的variousscripts实现这样的功能之一。

+0

SmartCase看起来像我想要的 – 2009-12-16 17:51:40

+0

这个答案帮了我加倍。我使用keepcase进行保留大小写的搜索。我回到你的答案,找出如何进行搜索,并用不同的多元化拼写(group/groups => body/bodies)替换。 – 2012-01-27 22:32:04

2

重做给它之后,答案有些人认为;-)

:[email protected]\([Uu]\)[email protected]\=((submatch(1)=="U")?"P":"p")."erson"@gc 

当然它可以改进,但这个想法停留。

2

有Vim的插件:keepcase.vim

+0

这很接近,但我用另一个CamelCase替换例子更新了这个插件似乎无法处理的问题,除非我误解了。 第一个例子的工作原理是这样的:SubstituteCase#\ cuser#person#g – 2009-12-16 17:49:22