具有敏感替换的vim不区分大小写的搜索

Jim*_*tts 24 vim

我有一个文件:

test
Test
Run Code Online (Sandbox Code Playgroud)

目前,如果我想用'foo'替换'test'的所有情况,用'Foo'替换'test',我必须使用两个命令:

:%s/test/foo/g
:%s/Test/Foo/g
Run Code Online (Sandbox Code Playgroud)

有什么方法可以用一个命令完成这个吗?

eps*_*lbe 15

我认为蒂姆教皇的这个vim插件将解决你的问题,安装它和 (%Subvert/{t}est/{f}oo/g%Subvert/test/foo/g感谢评论)会做的伎俩


Nat*_*ell 5

正如我的爷爷曾经说过的,对于每个插件,都有一个同样出色的 vim 单行程序。尝试

%s/\(test\|Test\)/\=submatch(0) =~ '\l.*' ? 'foo' : 'Foo'/g
Run Code Online (Sandbox Code Playgroud)

解释:

%s/ 替换整个缓冲区

\(test\|Test\)/ 匹配“测试”或“测试”

\= 使替代字符串使用以下表达式的计算结果

submatch(0) 在此上下文中计算为整个匹配的表达式

=~ '\l.*' 正则表达式匹配的字符串比较(针对以小写字母开头的单词)

... ? 'foo' : 'Foo' if-then-else 表达式,如果 ... 为真,则计算结果为 'foo',否则为 'Foo'

/g 在整条线上这样做

稍加修改,这应该足以满足我们的需求。参考:

:help :s
:help :sub-replace-\=
:help expression
Run Code Online (Sandbox Code Playgroud)

...我只是想对任何试图进入 vim 评估和表达式的人发出一点警告......它们非常违反直觉(我来自 C++ 背景,也许如果你来自 bash 或 python,它会更少一个问题)。我发现以下 vimscript 指南/自学课程非常有帮助:http ://learnvimscriptthehardway.stevelosh.com/