関数の引数を交換する


19

コードをリファクタリングするとき、関数の引数を交換できると便利です。

変更例:

func(foo[0], bar(), baz.spam)

func(baz.spam, foo[0], bar())

引数を左/右に交換して、関数の括弧とコンマを保持する方法はありますか?


注:それ自体が独自の引数を持つ関数呼び出しである引数を考慮する場合、これ非常に複雑にfunc(baz->spam, foo[0], bar(a, b, c))なる可能性があります。

回答:


23

プラグインなし

| カーソル位置を示します

func(foo[0], bar(), |baz.spam)

手順:

  1. dt) 削除します baz.spam
  2. Ff カーソルを文字fに移動します foo[0]
  3. vt,p foo [0]を削除し、それに置き換えます baz.spam
  4. $P 括弧の前にfoo [0]を貼り付けます
  5. 他のすべての手順1〜4を繰り返します。

プラグインあり

  • Peter Rinckerによるvim-argumentative:関数の引数を移動するためのテキストオブジェクトを提供します(デフォルトマッピング:<,および>,)。
  • Tom McDonaldによるvim-exchange:2つの選択を交換するための便利なマッピングを提供します(デフォルトマッピング:cx通常モードとXビジュアルモード)。
  • Andrew Radevによるvim- sideways:関数の引数(およびその他の区切られた項目)を左右に移動します(デフォルトのマッピング:)NA
  • machakannによるvim-swap:区切られたアイテムを並べ替えます(デフォルトのマッピング:g<およびg>)。

6
非プラグインソリューションは、このケースに非常に特化しています...
elyashiv

3
@elyashivのアイデアは、関数の引数に同様の手法を使用できるということです。基本的に、単語をヤンクし、別の単語を視覚的に選択して貼り付けます。Vimは削除された文字をレジスタにヤンクし、最初にヤンクした場所に貼り付けます。
akshay

1
vim-sidewaysの場合は+1!最後のセクションでは、cia 「引数の変更」という非常に優れた機能について説明します。❤️
マルタインCourteaux

5

3つの方法を紹介します。最初の2つは特定のケースで、キーストロークが少なくて済みます。最後のものは汎用です。 |カーソル位置を表します。


隣接する引数を交換します(最後の2つでは機能しません)

function func(foo[0], |bar(), baz.spam, qux->norf)

手順:

  1. dW 現在のWordを削除します(引数)
  2. W 次の引数の最初の文字に移動します
  3. P カーソルの前に貼り付けます

最後の2つの引数を入れ替える

function func(foo[0], bar()|, baz.spam, qux->norf)

手順:

  1. dt, 次のコンマまで削除
  2. E 次の引数の最後の文字に移動する
  3. P カーソルの前に貼り付けます

任意の2つの引数を交換します

function func(|foo[0], bar(), baz.spam, qux->norf)

手順:

  1. vt,d カンマまで視覚的に削除
  2. W 交換したい引数に達するまで数回
  3. gP カーソルの前に貼り付け、コンテンツを貼り付けた後の文字にカーソルを置きます
  4. dt,次のコンマまで削除します。交換する,ことにより、)これが最後の引数であれば
  5. `< 最後の視覚領域の開始に戻ります(カーソルはコンマに配置されます)
  6. P カーソルの前に貼り付けます

編集:@ aharris88が指すように、OPは最後の引数を最初にして、他のすべてを右に移動することを望んでいます。

引数を右に回転

function func(foo[0], bar(), baz.spam|, qux->norf)

手順:

  1. dw 削除する ,␣
  2. dt) 最後の引数を削除
  3. %p 開き括弧にジャンプして最後の引数を貼り付けます
  4. a,␣ コンマとスペースを挿入します
  5. <Esc> 通常モードに戻る

または、通常モードを終了したくない場合:

  1. "rdw,␣レジスターに削除するr
  2. dt) 最後の引数を削除
  3. %p 開き括弧にジャンプして最後の引数を貼り付けます
  4. "rp レジスタの内容を貼り付ける r

ボーナス:各ケースのGIF: swap1swap2swap3およびrotate


この答えは引数を交換しますが、最後の引数を最初に移動する方法である質問には答えません。
aharris88

@ aharris88、あなたは正しい。回答を編集しました。
ゴンサロリベイロ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.