7

有没有人有插件或宏来用 Vim 中的 and 替换匹配的大括号{?最好像这样转换单行语句:}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,但都没有找到办法。

4

2 回答 2

9

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

安装插件后,将光标放在{ } do或上end并按下<Leader>b以交换块样式。

于 2013-03-16T04:33:38.030 回答
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并检查结果。

于 2013-03-16T03:06:17.120 回答