在Vim中保留替代案例

时间:2009-04-23 16:26:23

标签: vim replace

可以在Vim中完成this吗?

  

我的意思是:搜索'BadJob'   并用'GoodJob'代替   以下替换

'badjob' -> 'goodjob'  
'BadJob' -> 'GoodJob'  
'badJob' -> 'goodJob'  
'BADJOB' -> 'GOODJOB'

7 个答案:

答案 0 :(得分:99)

使用abolish.vim

:%S/badjob/goodjob/g

答案 1 :(得分:27)

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

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

答案 2 :(得分:10)

确定你可以

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

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

答案 3 :(得分:5)

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

\s

除搜索模式外,您还需要在替换代码中编辑四个:%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 错误 \ ze 作业 / \ =
  (submatch(0)[0]是#toupper(submatch(0)[0])?' G ':' g ')。
  (submatch(0)[1]是#toupper(submatch(0)[1])?' OOD ':' ood ')

请勿使用此“橙色”版本进行粘贴,因为其换行符也会破坏命令。

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


\ze ??让我解释一下......(如果有兴趣的话。)

is#(也在#others中)强制区分大小写。否则,使用==#(我使用,因为有用的:set smartcase需要),vim会考虑:set ignorecase !!

虽然很疯狂,但我们真的应该考虑到它:因为它依赖于用户设置,所以 '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' strings是另一个好习惯:http://google.github.io/styleguide/vimscriptguide.xml?showone=Strings#Strings


HT @fc。 - 这个答案建立在answer的基础上,修正了一些缺点。

答案 4 :(得分:3)

如果您只匹配一个精确的(不区分大小写)字符串和一些可能的大写字母,另一种可能性是:

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

答案 5 :(得分:2)

keepcase 插件的替代方案是SmartCase - replacing words while keeping original case。 (不要因为收视率不好而让自己灰心丧气。)

答案 6 :(得分:1)

怎么样

:%s/\Cbadjob/goodjob/
:%s/\CBadJob/GoodJob/
:%s/\CbadJob/goodJob/  
:%s/\CBADJOB/GOODJOB/

见:https://stackoverflow.com/a/2287449/5599687