在Vim中保留替代案例

duk*_*ave 148 vim replace

可以在Vim中做什么?

我的意思是:搜索'BadJob'并替换为'GoodJob'将进行以下替换

'badjob' -> 'goodjob'  
'BadJob' -> 'GoodJob'  
'badJob' -> 'goodJob'  
'BADJOB' -> 'GOODJOB'
Run Code Online (Sandbox Code Playgroud)

Mar*_*ato 109

使用abolish.vim:

:%S/badjob/goodjob/g
Run Code Online (Sandbox Code Playgroud)

  • 我们不应该得到蒂姆·波普。 (4认同)
  • 这个插件似乎不适合我。如果我有一个像“BadJob”这样的词,并且我想用“GoodJob”替换它,我就不能使用“%S/badjob/goodjob/g”。它无法检测到匹配项。 (3认同)

LB4*_*B40 27

我不知道这是否是你正在寻找的那种解决方案......但我已经使用过: keepcase.vim

在vim中没有其他支持......


小智 10

你可以的

:s/\cbad/\= strpart(submatch(0), 0 ,1) == toupper(strpart(submatch(0), 0, 1)) ? "GOOD" : "good"/

PS.我猜keepcase.vim封装了一些类似的逻辑:)


Gab*_*ele 9

关于什么

:%s/\Cbadjob/goodjob/
:%s/\CBadJob/GoodJob/
:%s/\CbadJob/goodJob/  
:%s/\CBADJOB/GOODJOB/
Run Code Online (Sandbox Code Playgroud)

请参阅:/sf/answers/160121461/


Aar*_*oma 6

你可以粘贴并改编它:(
当然,如果你经常这样做,你会想要一个插件而不是这个怪物.但是对于一些匆忙但只需要一次的人来说,这是一个快速的黑客攻击为你的粘贴乐趣:)

:%s/\cbad\zejob/\= ( submatch(0)[0] is# toupper(submatch(0)[0]) ? 'G' : 'g' ) . ( submatch(0)[1] is# toupper(submatch(0)[1]) ? 'OOD' : 'ood' )

除了搜索模式,您还必须编辑替换代码中的四个'字符串':以粗体编辑部分:

:%s /\c bad\ze job /\=
(submatch(0)[0]是#toupper(submatch(0)[0])?' G ':' g ').
(submatch(0)[1]是#toupper(submatch(0)[1])?' OOD ':' ood ')

不要使用此"橙色"版本进行粘贴,因为其换行符也会破坏命令.

/\ze是用于标记正向前瞻的vim正则表达式语法糖:\ze检查后面的模式,但不替换.


is#?? 让我解释一下......(如果有兴趣的话.)

#(也在==#其他人中)强制区分大小写.否则,:set ignorecase(我使用,因为这是有用的必需:set smartcase),vim会考虑'a' == 'A'!!

虽然很疯狂,但我们真的应该考虑到它:因为它依赖于用户设置,所以==应该使用NEVAR! (除非它实际上是你想要的.)我甚至会==#在比较整数时遵循建议使用:http://learnvimscriptthehardway.stevelosh.com/chapters/22.html#code-defensively

is#而不是==#另一种防御性编码方式:它提高了类型安全性:http: //google.github.io/styleguide/vimscriptguide.xml?showone = Type_checking#Type_checking
在与字符串文字进行比较时应该使用它.

'single-quoted'而不是"double quoted" 字符串是另一个好的做法:http://google.github.io/styleguide/vimscriptguide.xml?showow = Strings#Strings


HT @fc.-这个答案建立在他们的答案,确定一些缺点.


ram*_*ion 5

如果您只匹配具有几个可能的大写字母的精确(独立于大小写的)字符串,另一种可能性是:

:s/abc/\={'abc':'xyz','Abc':'Xyz'}[submatch(0)]/i
Run Code Online (Sandbox Code Playgroud)