如何在Vim中通过Ruby脚本处理选中内容并替换为返回值?
如何在Vim中用Ruby处理选中内容并替换为脚本返回值
一、直接在Vim中嵌入Ruby代码处理
如果你想直接在Vim里编写Ruby逻辑处理选中内容,步骤非常简单:
- 先用**可视模式(v/V)**选中你要处理的文本(比如例子里的
12|22|33) - 按下
:键,Vim会自动补全选中范围的标记'<,'>,这时候输入ruby加上你的处理代码即可:
:'<,'>ruby Vim::Range.new(Vim::Mark.get("'<"), Vim::Mark.get("'>")).each { |line| line.text = line.text.split("|").map(&:to_i).map { |num| num * 2 }.join("|") }
这段代码的逻辑:
Vim::Range.new(...)获取你选中的文本范围(支持多行处理)- 遍历每一行,把行内容按
|分割成数组,转成整数后翻倍,再用|拼接回去 - 最后把处理后的内容赋值给
line.text,直接替换原行内容
如果只是处理单行,也可以简化成更紧凑的版本:
:'<,'>ruby l = Vim::Buffer.current.line(Vim::Mark.get("'<")[0]); Vim::Buffer.current.set_line(Vim::Mark.get("'<")[0], l.split("|").map(&:to_i).map{|n|n*2}.join("|"))
二、Vim原生替代方案(更简洁高效)
其实对于你这个数字翻倍的场景,完全不需要Ruby,用Vim自带的substitute命令就能搞定:
同样先选中目标内容,然后执行:
:'<,'>s/\d\+/\=submatch(0)*2/g
拆解一下这个命令:
s/\d\+/:匹配每一个连续的数字(\d\+是正则表达式,匹配一个或多个数字)\=:告诉Vim后面是一个表达式,需要计算出替换值submatch(0)*2:把匹配到的数字(submatch(0)代表整个匹配内容)乘以2g:全局替换,一行内所有匹配的数字都会被处理
这个方法不需要依赖Ruby环境,对于这种简单的文本处理场景非常高效。
内容的提问来源于stack exchange,提问作者23tux
相关产品推荐
相关产品推荐

