我有一个文件:
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)
有什么方法可以用一个命令完成这个吗?
正如我的爷爷曾经说过的,对于每个插件,都有一个同样出色的 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/
| 归档时间: |
|
| 查看次数: |
3169 次 |
| 最近记录: |