Vim中的案例保存替代品

这可以在Vim中完成吗?

我的意思是:search“BadJob”并replace为“GoodJob”将执行以下replace操作

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

使用abolish.vim :

 :%S/badjob/goodjob/g 

我不知道这是否是你正在寻找的解决scheme…但我已经使用这个: keepcase.vim

没有任何支持,否则在VIM …

当然可以

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

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

你可以粘贴和适应这个:
(当然,如果你不时这样做,你会需要一个插件,而不是这个怪物,但是对于一些急着只需要一次的人来说,这对于你的粘贴乐趣是一个快速的入侵:)

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

除search模式之外,您必须编辑replace代码中的四个'string' :以粗体编辑部分:

:%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正则expression式语法糖,用于标记正向:在\ze之后的模式被检查,但不被replace。

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

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

疯狂的,我们真的应该考虑它:因为它是用户设置相关的, ==应该使用NEVAR! (除了实际上是你想要的。)我甚至会按照build议使用==#比较整数: http : //learnvimscriptthehardway.stevelosh.com/chapters/22.html#code-defensively

is#而不是==#是防御性编码的另一种方式:它提高了types安全性: http : //google.github.io/styleguide/vimscriptguide.xml? ==# Type_checking
它应该用于比较string文字。

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

HT @fc。 – 这个答案build立在他们的答案上 ,修正了一些缺点。

keepcase插件的替代品是SmartCase – 在保留原始大小写的同时replace单词 。 (不要让自己被不好的评价劝阻)