是否有人使用插件或宏来在Vim中将{
大括号}
替换为do
和end
?最好像这样转换单行语句:
foo.each { |f| f.whatever }
成:
foo.each do |f|
f.whatever
end
我可以为这一个案例制作一个宏,但是我想要一些可以处理转换现有多行,可能很复杂的块的东西,例如:
foo.each { |f|
f.bars.each { |b| b.whatever }
hash = { a: 123, b: 456 }
}
成:
foo.each do |f|
f.bars.each { |b| b.whatever }
hash = { a: 123, b: 456 }
end
我查看了vim-surround和rails.vim,并且找不到任何方法。
答案 0 :(得分:8)
有一个名为Vim Blockle的Vim插件可以执行此功能。
安装插件后,您可以将光标放在{
}
do
或end
上,然后按<Leader>b
以交换块样式。
答案 1 :(得分:0)
我假设在你的多行示例中,输出将是:
foo.each do |f|
f.bars.each do |b| b.whatever end
hash = { a: 123, b: 456 }
end
也就是说,f.bars.each{...}
也应该被替换。
如果是目标,请尝试:
gg/each\s*{<enter>qqf{%send<esc><c-o>sdo<esc>nq200@q
简短说明:
gg " move cursor to top
/each\s*{<enter> " search pattern we want
qq " start recording macro to register q
f{ " move to {
%send<esc> " move to closing {, and change it to "end", back to normal
<c-o>sdo " back to beginning { and change it into "do"
<esc>nq " back to normal, and go to next match, stop recording
然后你可以做例如200@q
并检查结果。