2009-12-16 56 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