Vim 中的保护案例替代

这个可以在 Vim 中完成吗?

我的意思是: 搜索“坏工作” 换成“好工作”就行了 以下替代品

'badjob' -> 'goodjob'
'BadJob' -> 'GoodJob'
'badJob' -> 'goodJob'
'BADJOB' -> 'GOODJOB'
27821 次浏览

我不知道这是不是你想要的解决办法,但我用过这个: 留着吧 Vim

没有任何支持,否则在 Vim..。

你当然可以

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

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

保管箱插件的一个替代品是 SmartCase-替换单词同时保留原来的大小写。(不要因为收视率低而泄气。)

使用 废除:

:%S/badjob/goodjob/g

对于大多数(非复杂的)案例,我推荐@ramion 的 回答而不是我的。
如果你有时间,我的帖子可能还是值得的。提高您对脚本陷阱的认识。



你可以粘贴并调整这个:
(当然,如果你时不时这样做,你会想要一个插件,而不是这个怪物。但是对于一些急于求成而且只需要一次的人来说,这是一个快速解决粘贴快感的方法:)

:% s/cbad zejob/= (submatch (0)[0]是 # toupper (submatch (0)[0]) ? ‘ G’: ‘ g’)。(submatch (0)[1]是 # toupper (submatch (0)[1]) ? ‘ OOD’: ‘ OOD’)

除了搜索模式之外,还必须在替换代码中编辑4个 'strings': 编辑 大胆中的部分:

:% s/c很糟糕 ze工作/=
(submatch (0)[0]是 # toupper (submatch (0)[0]) ? ‘ G’: ‘ ’)。
(submatch (0)[1]是 # toupper (submatch (0)[1]) ? ‘ 值日官’: ‘ 很好’)

不要使用这个“橙色”版本粘贴,因为它的换行符也会破坏命令。

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


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

#(同样在 ==#其他人中)执行大小写敏感性。否则,使用 :set ignorecase(我使用它,因为这是有用的 :set smartcase所必需的) ,vim 将考虑使用 'a' == 'A'! !
< img src = “ https://i.stack.imgur.com/UE9qp.jpg”height = “140”> < img src = “ https://i.stack.imgur.com/Zeij0.jpg”height = “140”>
尽管这很疯狂,但我们确实应该考虑到这一点: 因为它是依赖于用户设置的,==应该使用 NEVAR!(除非它实际上是您想要的。)在比较整数时,我甚至会遵循使用 ==#的建议: < a href = “ http://learnvimscriptthehardway.stevelosh.com/lessons/22.html # code-Defense”rel = “ nofollow norefrer”> http://learnvimscriptthehardway.stevelosh.com/chapters/22.html#code-defensively

is# 代替 ==#是另一种防御性编码方式: 它提高了类型安全性: < a href = “ http://google.github.io/styleguide/vimscriptguide.xml? showone = Type _ check # Type _ check”rel = “ nofollow norefrer”> http://google.github.io/styleguide/vimscriptguide.xml?showone=type_checking#type_checking
当与字符串文字进行比较时,应该使用它。

'single-quoted'代替 "double quoted" 绳子是另一种好的做法: http://google.github.io/styleguide/vimscriptguide.xml?showone=Strings#Strings


HT@fc-这个答案建立在他们的[答案]( https://stackoverflow.com/questions/782511/case-preserving-substitute-in-vim/782617#782617)之上,修正了一些缺点。

如果您只匹配一个精确的(与大小写无关的)字符串和一些可能的大小写,那么另一种可能性是:

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

关于什么

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

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