【发布时间】:2010-10-21 10:00:14
【问题描述】:
this 可以在 Vim 中完成吗?
我的意思是:搜索“BadJob” 用“GoodJob”代替就可以了 以下替换
'badjob' -> 'goodjob' 'BadJob' -> 'GoodJob' 'badJob' -> 'goodJob' 'BADJOB' -> 'GOODJOB'
【问题讨论】:
-
这应该是 vim 的功能。这很有意义。
this 可以在 Vim 中完成吗?
我的意思是:搜索“BadJob” 用“GoodJob”代替就可以了 以下替换
'badjob' -> 'goodjob' 'BadJob' -> 'GoodJob' 'badJob' -> 'goodJob' 'BADJOB' -> 'GOODJOB'
【问题讨论】:
怎么样
:%s/\Cbadjob/goodjob/
:%s/\CBadJob/GoodJob/
:%s/\CbadJob/goodJob/
:%s/\CBADJOB/GOODJOB/
【讨论】:
如果您只匹配一个精确的(不区分大小写的)字符串和几个可能的大写,另一种可能性是:
:s/abc/\={'abc':'xyz','Abc':'Xyz'}[submatch(0)]/i
【讨论】:
你可以直接粘贴和修改这个:
(当然,如果你不时这样做,你会想要一个插件而不是这个怪物。但对于一些赶时间的人来说需要它一次,这是您粘贴乐趣的快速破解:)
:%s/\cbad\zejob/\= ( submatch(0)[0] is# toupper(submatch(0)[0]) ? 'G' : 'g' ) . ( submatch(0)[1] is# toupper(submatch(0)[1]) ? 'OOD' : 'ood' )
除了搜索模式,你还得编辑替换代码中的四个'strings':编辑粗体中的部分:
:%s/\c糟糕\ze工作/\=
( submatch(0)[0] is# toupper(submatch(0)[0]) ? 'G' : 'g' ) 。
( submatch(0)[1] is# toupper(submatch(0)[1]) ? 'OOD' : 'ood' )
请勿使用此“橙色”版本进行粘贴,因为它的换行符也会破坏命令。
/\ze 是 vim 正则表达式语法糖,用于标记积极的前瞻:\ze 之后的模式被检查,但没有被替换。
is#??让我解释一下……(如果有兴趣。)
#(也在==# 和others 中)强制区分大小写。否则,使用: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" strings 是另一个好的做法:http://google.github.io/styleguide/vimscriptguide.xml?showone=Strings#Strings
HT @fc。 - 这个答案建立在他们的answer 之上,修正了一些缺点。
【讨论】:
使用abolish.vim:
:%S/badjob/goodjob/g
【讨论】:
BadJob 这样的词,我想用GoodJob 替换它,我不能使用%S/badjob/goodjob/g。它无法检测到匹配。
%S/BadJob/GoodJob/g,然后 Subvert 命令将切换到混合大小写模式,并将执行 OP 给出的所有替换。
%S 的参数中是否存在混合大小写会激活混合大小写模式,或者输入参数 BadJob 是否需要与您要替换的内容完全匹配?前者似乎是奇怪的用户体验,而后者似乎违背了目的。
keepcase 插件的替代方案是SmartCase - replacing words while keeping original case。 (不要因为差评而气馁。)
【讨论】:
:%s/file\A\?size/\=SmartCase("LastModifiedTime")/ig?
:SmartCase 命令。我已经扩展了in my own fork。请注意,这需要 ingo-library 作为依赖项。
当然可以
:s/\cbad/\= strpart(submatch(0), 0 ,1) == toupper(strpart(submatch(0), 0, 1)) ? "GOOD" : "good"/
ps。我猜keepcase.vim封装了一些类似的逻辑:)
【讨论】:
:set ignorecase 时,这将失败。 2. Bad 将替换为 GOOD 而不是 Good。 3. 问题的“job”部分被忽略,所以这也将替换lambada → lamgooda。在我的answer 中对这些错误和其他一些内容进行了修复和解释。 (还有 LOLOWL!)
我不知道这是否是您正在寻找的那种解决方案......但我使用过这个: keepcase.vim
vim 中没有其他支持...
【讨论】: