可以在Vim中完成this吗?
我的意思是:搜索'BadJob' 并用'GoodJob'代替 以下替换
'badjob' -> 'goodjob' 'BadJob' -> 'GoodJob' 'badJob' -> 'goodJob' 'BADJOB' -> 'GOODJOB'
答案 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/