【问题标题】:Case preserving substitute in VimVim 中的大小写保留替换
【发布时间】:2010-10-21 10:00:14
【问题描述】:

this 可以在 Vim 中完成吗?

我的意思是:搜索“BadJob” 用“GoodJob”代替就可以了 以下替换

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

【问题讨论】:

  • 这应该是 vim 的功能。这很有意义。

标签: vim replace


【解决方案1】:

怎么样

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

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

【讨论】:

    【解决方案2】:

    如果您只匹配一个精确的(不区分大小写的)字符串和几个可能的大写,另一种可能性是:

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

    【讨论】:

      【解决方案3】:

      你可以直接粘贴和修改这个:
      (当然,如果你不时这样做,你会想要一个插件而不是这个怪物。但对于一些赶时间的人来说需要它一次,这是您粘贴乐趣的快速破解:)

      :%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 之上,修正了一些缺点。

      【讨论】:

        【解决方案4】:

        使用abolish.vim:

        :%S/badjob/goodjob/g
        

        【讨论】:

        • 我们配不上蒂姆·波普。
        • 这个插件似乎不适合我。如果我像BadJob 这样的词,我想用GoodJob 替换它,我不能使用%S/badjob/goodjob/g。它无法检测到匹配。
        • @Roymunson 您需要做的是:%S/BadJob/GoodJob/g,然后 Subvert 命令将切换到混合大小写模式,并将执行 OP 给出的所有替换。
        • @shivams %S 的参数中是否存在混合大小写会激活混合大小写模式,或者输入参数 BadJob 是否需要与您要替换的内容完全匹配?前者似乎是奇怪的用户体验,而后者似乎违背了目的。
        【解决方案5】:

        keepcase 插件的替代方案是SmartCase - replacing words while keeping original case。 (不要因为差评而气馁。)

        【讨论】:

        • 有没有什么诀窍可以缩短那些难以记住且繁琐的命令,例如:%s/file\A\?size/\=SmartCase("LastModifiedTime")/ig
        • @MichaelHärtl:您可以使用:SmartCase 命令。我已经扩展了in my own fork。请注意,这需要 ingo-library 作为依赖项。
        【解决方案6】:

        当然可以

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

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

        【讨论】:

        • 是的,它从 2007 年开始::%SubstituteCase/\cbadjob/GoodJob/g ^^
        • 自 gVim 7.2 以来的含义?我在 gVim 7.1(2007 年 5 月 12 日)中尝试过它,但它不起作用:(
        • 不,我已在 2007 年将 :SubstituteCase 命令添加到插件中。仅此而已。该插件在 vim.org 上可用,并且不像大多数插件一样随 vim 一起提供。
        • 1.当用户拥有:set ignorecase 时,这将失败。 2. Bad 将替换为 GOOD 而不是 Good。 3. 问题的“job”部分被忽略,所以这也将替换lambadalamgooda。在我的answer 中对这些错误和其他一些内容进行了修复和解释。 (还有 LOLOWL!)
        【解决方案7】:

        我不知道这是否是您正在寻找的那种解决方案......但我使用过这个: keepcase.vim

        vim 中没有其他支持...

        【讨论】:

          猜你喜欢
          • 2010-12-27
          • 2022-01-16
          • 1970-01-01
          • 1970-01-01
          • 2010-09-26
          • 2013-04-29
          • 1970-01-01
          • 2013-09-25
          • 1970-01-01
          相关资源
          最近更新 更多