Pertukaran argumen fungsi


19

Ketika refactoring kode akan berguna untuk dapat bertukar argumen fungsi.

Mengubah misalnya:

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

ke

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

Apakah ada cara untuk menukar argumen ke kiri / kanan, menjaga tanda kurung fungsi dan koma di tempat?


Catatan, ini bisa menjadi sangat terlibat jika Anda ingin menjelaskan argumen yang mereka sendiri panggil fungsi dengan argumen mereka sendiri - misalnya: func(baz->spam, foo[0], bar(a, b, c))- mendukung kasus-kasus ini mungkin melibatkan beberapa penguraian yang lebih komprehensif.

Jawaban:


23

Tanpa plugin

| menunjukkan posisi kursor

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

Langkah:

  1. dt) akan dihapus baz.spam
  2. Ff akan memindahkan kursor ke karakter f in foo[0]
  3. vt,p akan menghapus foo [0] dan menggantinya dengan baz.spam
  4. $P akan menempelkan foo [0] sebelum parens
  5. Ulangi langkah 1-4 untuk yang lainnya.

Dengan plugin

  • vim-argumentatif oleh Peter Rincker : Menyediakan objek teks untuk bergerak di sekitar argumen fungsi (Pemetaan default: <,dan >,).
  • pertukaran-vim oleh Tom McDonald : Menyediakan pemetaan praktis untuk bertukar dua pilihan (pemetaan default: cxdalam mode normal dan Xdalam mode visual).
  • vim-sideways oleh Andrew Radev : Memindahkan argumen fungsi (dan item lain yang dibatasi oleh sesuatu) ke kiri dan kanan (Pemetaan default:) NA.
  • vim-swap oleh machakann : Susun ulang item yang dibatasi (Pemetaan default: g<dan g>).

6
solusi non-plugin sangat spesifik untuk kasus ini ...
elyashiv

3
@elyashiv idenya adalah bahwa Anda dapat menggunakan teknik serupa untuk setiap argumen fungsi. Pada dasarnya, tarik sebuah kata, pilih secara visual kata lain, rekatkan, yang Vim akan menarik karakter yang dihapus ke register, dan kemudian tempel di mana Anda pertama kali menarik.
akshay

1
+1 untuk vim-sideways! Bagian terakhir menjelaskan fitur yang sangat bagus: cia untuk "mengubah argumen". ❤️
Martijn Courteaux

5

Saya menyajikan 3 metode. Dua yang pertama adalah kasus-kasus tertentu, yang membutuhkan sedikit penekanan tombol. Yang terakhir adalah generik. |mewakili posisi kursor.


Tukar argumen yang berdekatan (tidak berfungsi untuk dua yang terakhir)

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

Langkah:

  1. dW hapus Word saat ini (argumen)
  2. W pergi ke karakter pertama dari argumen berikutnya
  3. P rekatkan di depan kursor

Tukar dua argumen terakhir

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

Langkah:

  1. dt, hapus sampai koma berikutnya
  2. E pergi ke karakter terakhir dari argumen berikutnya
  3. P rekatkan di depan kursor

Tukar dua argumen

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

Langkah:

  1. vt,d hapus secara visual sampai koma
  2. W beberapa kali hingga Anda mencapai argumen yang ingin Anda tukarkan
  3. gP rekatkan sebelum kursor dan tempatkan kursor pada char setelah konten yang disisipkan
  4. dt,hapus sampai koma berikutnya. ganti ,dengan )jika ini argumen terakhir
  5. `< kembali ke permulaan area visual terakhir (kursor akan ditempatkan di koma)
  6. P rekatkan di depan kursor

Sunting: seperti yang ditunjukkan oleh @ aharris88 OP ingin argumen terakhir menjadi yang pertama dan memindahkan yang lainnya dengan benar.

Putar argumen ke kanan

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

Langkah:

  1. dw menghapus ,␣
  2. dt) hapus argumen terakhir
  3. %p lompat ke membuka tanda kurung dan tempel argumen terakhir
  4. a,␣ masukkan koma dan spasi
  5. <Esc> kembali ke mode normal

Atau, jika Anda tidak ingin meninggalkan mode normal:

  1. "rdwhapus ,␣ke dalam registerr
  2. dt) hapus argumen terakhir
  3. %p lompat ke membuka tanda kurung dan tempel argumen terakhir
  4. "rp rekatkan konten register r

Bonus: GIF untuk setiap kasus: swap1 , swap2 , swap3 dan rotate


Sementara jawaban ini memang bertukar argumen, itu tidak menjawab pertanyaan, yaitu bagaimana cara memindahkan argumen terakhir ke awal.
aharris88

@ aharris88, kamu benar. Saya mengedit jawaban saya.
Gonçalo Ribeiro
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.