用Vim中的do / end替换匹配的{braces}(Ruby)

时间:2013-03-16 02:38:41

标签: ruby vim

是否有人使用插件或宏来在Vim中将{大括号}替换为doend?最好像这样转换单行语句:

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-surroundrails.vim,并且找不到任何方法。

2 个答案:

答案 0 :(得分:8)

有一个名为Vim Blockle的Vim插件可以执行此功能。

安装插件后,您可以将光标放在{ } doend上,然后按<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并检查结果。