this可以在Vim中实现吗?我的意思是:搜索'BadJob'并替换为'GoodJob'将执行以下替换
'badjob' -> 'goodjob' 'BadJob' -> 'GoodJob' 'badJob' -> 'goodJob' 'BADJOB' -> 'GOODJOB'
mgdq6dx11#
使用abolish.vim:
:%S/badjob/goodjob/g
0yg35tkg2#
我不知道这是不是你要找的解决办法。我用了这个:keepcase.vim在vim中没有其他支持。
hujrc8aj3#
当然可以:s/\cbad/\= strpart(submatch(0), 0 ,1) == toupper(strpart(submatch(0), 0, 1)) ? "GOOD" : "good"/我猜keepcase.vim封装了一些类似的逻辑:)
:s/\cbad/\= strpart(submatch(0), 0 ,1) == toupper(strpart(submatch(0), 0, 1)) ? "GOOD" : "good"/
nsc4cvqm4#
对于大多数(不复杂的)情况,我推荐@rampion的答案。如果你有一分钟的时间,我的文章可能仍然是值得的。提高对脚本陷阱的认识。您可以粘贴并调整以下内容:(Of当然,如果你经常这样做,你会想要一个插件而不是这个怪物。但对于一些谁是匆忙,只需要一次,这是一个快速黑客为您的粘贴乐趣:):%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]是否为# toupper(submatch(0)[0])?'G':'g')。(submatch(0)[1]是否为# toupper(submatch(0)[1])?'OOD':'ood')
:%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 regex的语法糖,用于标记一个积极的lookahead:检查\ze之后的模式,但不替换。是#?让我解释一下...(如有兴趣)#(也在==#和其他)强制区分大小写。否则,使用:set ignorecase(我使用它,因为这是有用的:set smartcase所必需的),vim将考虑'a' == 'A'!!
/\ze
\ze
是#
#
==#
:set ignorecase
:set smartcase
'a' == 'A'
尽管这很疯狂,但我们确实应该解释一下:因为它依赖于用户设置,所以应该使用**==!**(除非这实际上是你想要的。)我甚至会遵循建议,在比较整数时使用==#:http://learnvimscriptthehardway.stevelosh.com/chapters/22.html#code-defensivelyis#而不是==#是另一种防御性编码方式:它提高了类型安全性: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#StringsHT @fc. -这个答案基于他们的[答案](https://stackoverflow.com/questions/782511/case-preserving-substitute-in-vim/782617#782617),修复了一些缺点。
==
is#
'single-quoted'
"double quoted"
dgjrabp25#
如果你只匹配一个精确的(大小写无关的)字符串和几个可能的大写字母,另一种可能是:
:s/abc/\={'abc':'xyz','Abc':'Xyz'}[submatch(0)]/i
ltskdhd16#
什么事
:%s/\Cbadjob/goodjob/ :%s/\CBadJob/GoodJob/ :%s/\CbadJob/goodJob/ :%s/\CBADJOB/GOODJOB/
参见:https://stackoverflow.com/a/2287449/5599687
5lhxktic7#
qvsjd97n8#
当然,你可以这样做:首先声明一些包含case和replacement的变量:let a = ['badjob', 'BadJob', 'badJob', 'BADJOB']let b = ['goodjob', 'GoodJob', 'goodJob', 'GOODJOB']第二,应用for循环,如下所示:for i in range(0,3) | exec '%s/' . a[i] . '/' . b[i] . '/g' | endfor注意range函数从0开始。最好的问候。
let a = ['badjob', 'BadJob', 'badJob', 'BADJOB']
let b = ['goodjob', 'GoodJob', 'goodJob', 'GOODJOB']
for i in range(0,3) | exec '%s/' . a[i] . '/' . b[i] . '/g' | endfor
8条答案
按热度按时间mgdq6dx11#
使用abolish.vim:
0yg35tkg2#
我不知道这是不是你要找的解决办法。我用了这个:keepcase.vim
在vim中没有其他支持。
hujrc8aj3#
当然可以
:s/\cbad/\= strpart(submatch(0), 0 ,1) == toupper(strpart(submatch(0), 0, 1)) ? "GOOD" : "good"/
我猜keepcase.vim封装了一些类似的逻辑:)
nsc4cvqm4#
对于大多数(不复杂的)情况,我推荐@rampion的答案。
如果你有一分钟的时间,我的文章可能仍然是值得的。提高对脚本陷阱的认识。
您可以粘贴并调整以下内容:
(Of当然,如果你经常这样做,你会想要一个插件而不是这个怪物。但对于一些谁是匆忙,只需要一次,这是一个快速黑客为您的粘贴乐趣:)
:%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]是否为# toupper(submatch(0)[0])?'G':'g')。
(submatch(0)[1]是否为# toupper(submatch(0)[1])?'OOD':'ood')
/\ze
是vim regex的语法糖,用于标记一个积极的lookahead:检查\ze
之后的模式,但不替换。是#
?让我解释一下...(如有兴趣)#
(也在==#
和其他)强制区分大小写。否则,使用:set ignorecase
(我使用它,因为这是有用的:set smartcase
所必需的),vim将考虑'a' == 'A'
!!尽管这很疯狂,但我们确实应该解释一下:因为它依赖于用户设置,所以应该使用**
==
!**(除非这实际上是你想要的。)我甚至会遵循建议,在比较整数时使用==#
:http://learnvimscriptthehardway.stevelosh.com/chapters/22.html#code-defensivelyis#
而不是==#
是另一种防御性编码方式:它提高了类型安全性: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#StringsHT @fc. -这个答案基于他们的[答案](https://stackoverflow.com/questions/782511/case-preserving-substitute-in-vim/782617#782617),修复了一些缺点。
dgjrabp25#
如果你只匹配一个精确的(大小写无关的)字符串和几个可能的大写字母,另一种可能是:
ltskdhd16#
什么事
参见:https://stackoverflow.com/a/2287449/5599687
5lhxktic7#
qvsjd97n8#
当然,你可以这样做:
首先声明一些包含case和replacement的变量:
let a = ['badjob', 'BadJob', 'badJob', 'BADJOB']
let b = ['goodjob', 'GoodJob', 'goodJob', 'GOODJOB']
第二,应用for循环,如下所示:
for i in range(0,3) | exec '%s/' . a[i] . '/' . b[i] . '/g' | endfor
注意range函数从0开始。
最好的问候。