vim-swap で関数の引数を並べ替える

Vim の話です。

vim-swap というプラグインを以前書きまして、これを更新したよ、というのがこの記事の内容です。

これは何?

もっとも代表的な用途は、関数の引数のようなコンマで区切られたテキストの順番を入れ替える、というものです。例えば、次のような三つの引数をとる関数があり Banana の上にカーソルがあるとします。

    Basket(Apple, Banana, Cherry)

この時 g< と入力すると BananaApple を入れ替えます。

    Basket(Banana, Apple, Cherry)

反対に、g> と入力すると BananaCherry を入れ替えます。

    Basket(Apple, Cherry, Banana)

もう一つ機能があって、gs と入力すると対話的に入れ替えを行う swap mode を開始します。これは何が嬉しいのかと申しますと、ちょっと複雑な入れ替えを . で繰り返せるという点です。上の g<g> も、もちろん . で繰り返し可能ですが、繰り返せるのは一つの要素の入れ替えのみです。gs は複数の要素の移動をまとめて繰り返せます。

例えば、次のバッファには Basket(Cherry, Banana, Apple) が三回現れますが、これをすべて Basket(Apple, Banana, Cherry) にするために g>g< を使うと、. を繰り返し押す必要があります。

function! Basket(Cherry, Banana, Apple) abort
  return 0
endfunction

call Basket(Cherry, Banana, Apple)

call Basket(Cherry, Banana, Apple)

しかし、gs を使って入れ替えておくと、後は . 一回で変換できます。gif を見て何となく感じてください。

swap-mode-dotrepeat

何が変わったのか?

Swap mode のコマンドを増やしました。gs と入力して swap mode に入り、以下のコマンドを使います。満足したら <Esc> キーで swap mode を抜けます。

Sort

s / S キーで要素をソートします。s は昇順、S は降順にソートします。

swap-mode-sort

Reverse

r キーで要素を反転します。

swap-mode-reverse

Grouping

g キーでカーソル下の要素と右隣りの要素をグループ化して一つの要素として扱います。G でグループ化を解除します。

swap-mode-grouping


実装してみると、逆になぜ今までなかったのかと思うような機能ばかりでした。特にグルーピングがずっと欲しかった。部分的なソートや部分的な反転を実現したかったんですけど、力尽きたので切実に欲しくなってからにします。

vim-swap は最近 Github で 100 star を超えました🎉 ありがとうございます。