Trao đổi đối số hàm


19

Khi tái cấu trúc mã, sẽ rất hữu ích khi có thể hoán đổi các đối số hàm.

Thay đổi ví dụ:

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

vào

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

Có cách nào để hoán đổi đối số sang trái / phải, giữ nguyên dấu ngoặc đơn và dấu phẩy không?


Lưu ý, điều này có thể trở nên khá liên quan nếu bạn muốn tính đến các đối số mà chính chúng là các hàm gọi với các đối số của riêng chúng - ví dụ: func(baz->spam, foo[0], bar(a, b, c))- hỗ trợ các trường hợp này có thể sẽ liên quan đến một số phân tích cú pháp toàn diện hơn.

Câu trả lời:


23

Không có plugin

| cho biết vị trí con trỏ

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

Các bước:

  1. dt) sẽ xóa baz.spam
  2. Ff sẽ di chuyển con trỏ đến ký tự f trong foo[0]
  3. vt,p sẽ xóa foo [0] và thay thế nó bằng baz.spam
  4. $P sẽ dán foo [0] trước parens
  5. Lặp lại các bước 1-4 cho bất kỳ người nào khác.

Với các plugin

  • vim-argumentative của Peter Rincker : Cung cấp các đối tượng văn bản để di chuyển xung quanh các đối số chức năng (Ánh xạ mặc định: <,>,).
  • vim-exchange của Tom McDonald : Cung cấp các ánh xạ tiện dụng để trao đổi hai lựa chọn (Ánh xạ mặc định: cxở chế độ bình thường và Xở chế độ trực quan).
  • vim-sideway của Andrew Radev : Di chuyển các đối số chức năng (và các mục được phân tách bằng thứ gì đó) sang trái và phải (Ánh xạ mặc định NA:).
  • vim- exchange by machakann : Sắp xếp lại các mục được phân tách (Ánh xạ mặc định: g<g>).

6
giải pháp không phải là plugin rất cụ thể cho trường hợp này ...
elyashiv 8/2/2015

3
@elyashiv ý tưởng là bạn có thể sử dụng một kỹ thuật tương tự cho bất kỳ đối số hàm nào. Về cơ bản, kéo một từ, trực quan chọn một từ khác, dán, Vim sẽ đánh dấu ký tự đã xóa vào thanh ghi, sau đó dán vào nơi bạn bắt đầu từ đó.
akshay 8/2/2015

1
+1 cho vim-đi ngang! Phần cuối cùng mô tả một tính năng rất hay: cia "thay đổi đối số". ❤️
Martijn Courteaux

5

Tôi trình bày 3 phương pháp. Hai trường hợp đầu tiên là những trường hợp cụ thể, đòi hỏi ít tổ hợp phím hơn. Cái cuối cùng là chung chung. |đại diện cho vị trí con trỏ.


Hoán đổi các đối số liền kề (không hoạt động cho hai lần cuối)

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

Các bước:

  1. dW xóa từ hiện tại (đối số)
  2. W đi đến char đầu tiên của đối số tiếp theo
  3. P dán trước con trỏ

Hoán đổi hai đối số cuối cùng

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

Các bước:

  1. dt, xóa cho đến dấu phẩy tiếp theo
  2. E đi đến nhân vật cuối cùng của cuộc tranh luận tiếp theo
  3. P dán trước con trỏ

Hoán đổi bất kỳ hai đối số

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

Các bước:

  1. vt,d xóa trực quan cho đến khi dấu phẩy
  2. W nhiều lần cho đến khi bạn đạt được đối số bạn muốn trao đổi với
  3. gP dán trước con trỏ và đặt con trỏ lên char sau khi dán nội dung
  4. dt,xóa cho đến dấu phẩy tiếp theo. thay thế ,bằng )nếu đây là đối số cuối cùng
  5. `< quay trở lại việc năn nỉ khu vực hình ảnh cuối cùng (con trỏ sẽ được đặt ở dấu phẩy)
  6. P dán trước con trỏ

Chỉnh sửa: như được chỉ ra bởi @ aharris88, OP muốn đối số cuối cùng là đối số đầu tiên và di chuyển tất cả các đối số khác sang phải.

Xoay đối số sang phải

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

Các bước:

  1. dw xóa bỏ ,␣
  2. dt) xóa đối số cuối cùng
  3. %p nhảy đến mở ngoặc và dán đối số cuối
  4. a,␣ chèn dấu phẩy và dấu cách
  5. <Esc> trở về chế độ bình thường

Hoặc, nếu bạn không muốn rời khỏi chế độ bình thường:

  1. "rdwxóa ,␣vào sổ đăng kýr
  2. dt) xóa đối số cuối cùng
  3. %p nhảy đến mở ngoặc và dán đối số cuối
  4. "rp dán nội dung đăng ký r

Bonus: a GIF cho từng trường hợp: swap1 , swap2 , swap3xoay


Mặc dù câu trả lời này không trao đổi đối số, nhưng nó không trả lời câu hỏi, đó là cách di chuyển đối số cuối cùng sang đầu.
aharris88

@ aharris88, bạn nói đúng. Tôi chỉnh sửa câu trả lời của tôi.
Gonçalo Ribeiro
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.