2013-03-16 6 views
6

で実行/終了と一致{括弧}を交換誰もdoとのVimでend{ブレース}に一致交換するプラグインやマクロを持っていますか?私はその1つのケースのためのマクロを自分で作ることができますが、私はまた、既存のマルチ変換処理できる何かをしたいと思いますはVimの(ルビー)

foo.each do |f| 
    f.whatever 
end 

:へ

foo.each { |f| f.whatever } 

:好ましくは、このような単一ラインステートメントを回します以下のような-line、潜在的に複雑なブロック、:

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を見ていて、いずれかの方法を見つけていません。私はあなたの複数行の例では、出力は次のようになり仮定

+0

ルビーについてよく分かりません。しかし、なぜあなたのマルチラインの例(出力)は '{、}'だけが置換され、内側の 'f.bars.each {...'? – Kent

+0

両方をサポートするのはいいですが、通常は一度に1つのレベルを展開するだけで何もしたくありません。私のシナリオでは、単一ステートメントのインラインブロックを好んでいますが、しばしば別のステートメントまたは2つを追加したいと思っています。そのためにブロックを拡張したいと思います。はい、私はそれをすべてメソッドにリファクタリングする必要があることを知っています。 –

答えて

7

この機能を実行するVim BlockleというVimプラグインがあります。

あなたは{}doまたはendにカーソルを置き、ブロックのスタイルを交換する<Leader>bを押してプラグインをインストールしたら。

+0

ありがとう!ちょっと風変わりですが、これは私が探していたものです。 –

+1

私はBlockleのインストールを検討し、Blockleの作成者が推奨する 'splitjoin'を代わりにインストールしました:https://github.com/jgdavey/vim-blockle/issues/5 –

0

foo.each do |f| 
    f.bars.each do |b| b.whatever end 
    hash = { a: 123, b: 456 } 
end 

であること、f.bars.each{...}はあまりにも交換する必要があります。

それが目標であれば、この試してください:あなたは一例[email protected]のために行うと、結果を確認することができ

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 

gg/each\s*{<enter>qqf{%send<esc><c-o>sdo<esc>[email protected] 

短い説明を。

+0

それは私が後にしていることではありません。質問に対する私のコメントを参照してください。私は現在の行の範囲でのみ実行したい。私はこれをチェックし、私はそれで作業することができますかどうかを確認します。 –