สลับฟังก์ชันอาร์กิวเมนต์


19

เมื่อ refactoring code มันจะมีประโยชน์ที่จะสามารถแลกเปลี่ยนอากิวเมนต์ของฟังก์ชันได้

การเปลี่ยนเช่น:

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] ต่อหน้า parens
  5. ทำซ้ำขั้นตอนที่ 1-4 สำหรับผู้อื่น

ด้วยปลั๊กอิน

  • vim-argumentativeโดยPeter Rincker : จัดเตรียมวัตถุข้อความสำหรับเคลื่อนย้ายฟังก์ชันอาร์กิวเมนต์ (การแม็พเริ่มต้น: <,และ>,)
  • vim-exchangeโดยTom McDonald : ให้การจับคู่ที่สะดวกสบายเพื่อแลกเปลี่ยนสองตัวเลือก (การแมปเริ่มต้น: cxในโหมดปกติและXในโหมดภาพ)
  • เป็นกลุ่ม-ด้านข้างโดยแอนดรู Radev : ข้อโต้แย้งย้ายที่ทำงาน (และรายการที่คั่นด้วยโดยสิ่งอื่น) ทางซ้ายและขวา (แมปเริ่มต้น: NA)
  • vim-swapโดยmachakann : จัดลำดับรายการที่คั่นใหม่ (การแมปเริ่มต้น: g<และg>)

6
โซลูชันที่ไม่ใช่ปลั๊กอินนั้นมีความเฉพาะเจาะจงมากสำหรับเคส ...
elyashiv

3
@elyashiv ความคิดคือคุณสามารถใช้เทคนิคที่คล้ายกันสำหรับอาร์กิวเมนต์ของฟังก์ชันใด ๆ โดยพื้นฐานแล้วดึงคำออกมาเลือกคำอื่นแล้ววางซึ่ง Vim จะดึงตัวอักษรที่ถูกลบไปยังทะเบียนแล้ววางที่ที่คุณดึงออกมาเป็นครั้งแรก
akshay

1
+1 สำหรับเสียงเรียกเข้าด้านข้าง! ส่วนสุดท้ายอธิบายคุณลักษณะที่ดีมาก: cia ถึง "การเปลี่ยนแปลงในการโต้แย้ง" ❤️
Martijn Courteaux

5

ฉันนำเสนอ 3 วิธี สองกรณีแรกเป็นกรณีพิเศษซึ่งต้องใช้การกดแป้นน้อย คนสุดท้ายคือทั่วไป |แทนตำแหน่งเคอร์เซอร์


สลับอาร์กิวเมนต์ที่อยู่ติดกัน (ใช้ไม่ได้สำหรับสองรายการสุดท้าย)

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

ขั้นตอน:

  1. dW ลบคำปัจจุบัน (อาร์กิวเมนต์)
  2. W ไปที่อักขระตัวแรกของอาร์กิวเมนต์ถัดไป
  3. P วางก่อนเคอร์เซอร์

สลับสองอาร์กิวเมนต์สุดท้าย

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

ขั้นตอน:

  1. dt, ลบจนกว่าเครื่องหมายจุลภาคถัดไป
  2. E ไปที่ตัวละครสุดท้ายของการโต้แย้งต่อไป
  3. P วางก่อนเคอร์เซอร์

สลับสองอาร์กิวเมนต์ใด ๆ

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 สำหรับแต่ละกรณี: swap1 , swap2 , swap3และหมุน


ในขณะที่คำตอบนี้เป็นการแลกเปลี่ยนข้อโต้แย้งมันไม่ตอบคำถามซึ่งเป็นวิธีการย้ายอาร์กิวเมนต์สุดท้ายไปยังจุดเริ่มต้น
aharris88

@ aharris88 คุณพูดถูก ฉันแก้ไขคำตอบของฉัน
Gonçalo Ribeiro
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.