ChatGPT解决这个技术问题 Extra ChatGPT

Vim 中的大小写保留替换

this 可以在 Vim 中完成吗?

我的意思是:搜索 'BadJob' 并替换为 'GoodJob' 会执行以下替换 'badjob' -> 'goodjob' 'BadJob' -> 'GoodJob' 'badJob' -> 'goodJob' 'BADJOB' -> '好工作'

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

M
Mark Lodato

使用 abolish.vim

:%S/badjob/goodjob/g

我们不配蒂姆·波普。
这个插件似乎对我不起作用。如果我想使用 BadJob 之类的词,并且想用 GoodJob 替换它,则不能使用 %S/badjob/goodjob/g。它无法检测到匹配。
@Roymunson 您需要做的是:%S/BadJob/GoodJob/g,然后 Subvert 命令将切换到混合大小写模式,并将执行 OP 给出的所有替换。
@shivams %S 的参数中是否存在混合大小写激活混合大小写模式,或者输入参数 BadJob 是否需要逐字匹配您要替换的内容?前者看起来很奇怪,后者似乎违背了目的。
L
LB40

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

vim 中没有其他支持...


f
fc.

你当然可以

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

附言。我猜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 中对这些错误和其他一些内容进行了修复和解释。 (还有 LOLOWLs!)
A
Aaron Thoma

对于大多数(非复杂)案例,我推荐 @rampion 的 answer 而不是我的。
如果您有时间,我的帖子可能仍然值得。提高您对脚本问题的认识。

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

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

除了搜索模式之外,您还必须编辑替换代码中的四个'字符串': 编辑 bold 中的部分:

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

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

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

https://i.stack.imgur.com/99eI5.jpg

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。 - 这个答案建立在他们的[答案](https://stackoverflow.com/questions/782511/case-preserving-substitute-in-vim/782617#782617)之上,修复了一些缺点。


r
rampion

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

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

I
Ingo Karkat

keepcase 插件的替代方法是 SmartCase - replacing words while keeping original case。 (不要让自己因糟糕的收视率而气馁。)


有没有什么诀窍可以缩短那些难以记住且输入诸如 :%s/file\A\?size/\=SmartCase("LastModifiedTime")/ig 之类的命令的乏味命令?
@MichaelHärtl:您可以使用 :SmartCase 命令。我已经扩展了那个 in my own fork。请注意,这需要 ingo-library 作为依赖项。
G
Gabriele

关于什么

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

请参阅:https://stackoverflow.com/a/2287449/5599687