Vim中保留大小写的替代项


154

可以在Vim中做什么?

我的意思是:搜索“ BadJob”并替换为“ GoodJob”将进行以下替换

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

16
这应该是vim功能。这很有意义。
2014年

Answers:


120

使用abolish.vim

:%S/badjob/goodjob/g

13
我们不配蒂姆·波普。
安德鲁·基顿

1
这个插件似乎不适用于我。如果我喜欢这样一个词BadJob并且我想用它代替GoodJob,我不能使用%S/badjob/goodjob/g。无法检测到匹配项。
罗伊姆森

@Roymunson您需要做的是:%S/BadJob/GoodJob/g,然后Subvert命令将切换到混合大小写模式,并将执行OP给定的所有替换。
shivams

28

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

否则,没有其他支持。


11

当然可以

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

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


是的,它自2007年以来就做到了::%SubstituteCase / \ cbadjob / GoodJob / g ^^
Luc Hermitte 2009年

从gVim 7.2开始意味着什么?我在gVim 7.1(2007年5月12日)中尝试了该方法,但它不起作用:(
fc。09年

不,我在2007年向插件添加了:SubstituteCase命令。仅此而已。该插件可在vim.org上找到,并且大多数插件通常都没有随vim一起提供。
卢克·赫米特

1.当用户具有时,此操作将失败:set ignorecase。2. Bad将由GOOD代替Good。3.问题的“ job”部分将被忽略,因此它将替换lambadalamgooda。这些错误和我的回答中其他一些问题的修复和说明。(也很低!)
亚伦·托马

7

您可以粘贴并修改它:(
当然,如果您不时这样做,您将需要一个插件而不是这种怪诞的功能。但是对于一些急于只需要一次的人来说,这是一个快速的技巧。为了您的粘贴乐趣:)

:%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] is#toupper(submatch(0)[0])?' G ':' g ')。
(submatch(0)[1] is#toupper(submatch(0)[1])?' OOD ':' ood ')

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

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


is#?? 让我解释一下...(如果有兴趣。)

#(以及in ==#其他)强制区分大小写。否则,: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
Type_checking与字符串文字进行比较时应使用它。

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


HT @fc。-此答案以他们的答案为基础,并修复了一些缺点。


4

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

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

2

keepcase插件的替代方法是SmartCase-在保留原始大小写的同时替换单词。(不要让自己对不良评分感到沮丧。)


1
是否有技巧来缩短那些难以记住和乏味的键入命令:%s/file\A\?size/\=SmartCase("LastModifiedTime")/ig
MichaelHärtl2014年

@MichaelHärtl:您可以使用:SmartCase命令。我用自己的叉子来扩展它。请注意,这需要将ingo-library作为依赖项。
Ingo Karkat 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.