วางหลาย ๆ ครั้ง


98

วิธีใดที่ดีที่สุดแทนที่หลายบรรทัดด้วยเนื้อหาของคลิปบอร์ด

ปัญหาที่ฉันพบคือเมื่อฉันดึงเส้นแล้ววางทับอีกบรรทัด "ดึง" จะถูกแทนที่ด้วยเส้นที่ฉันเพิ่งแทนที่ ตอนนี้ถ้าฉันต้องการแทนที่บรรทัดอื่นด้วยบรรทัดเดียวกันฉันต้องกลับขึ้นไปและดึงอีก

ต้องมีวิธีที่ดีกว่านี้

คำตอบ:


110

ฉันมีสิ่งนี้ใน. vimrc ของฉัน:

xnoremap p pgvy

(หมายเหตุ: สิ่งนี้จะใช้ได้เฉพาะกับการลงทะเบียนเริ่มต้น แต่การจับคู่นี้ง่ายต่อการจดจำ) การเขียนฉบับที่ละเอียดขึ้นน่าจะทำได้ นอกจากนี้คุณยังสามารถใช้ P เพื่อรับพฤติกรรมเก่า ๆ


30
ฉลาด. 'p' เพื่อวาง 'gv' เพื่อเลือกสิ่งที่เลือกไว้ในตอนแรกอีกครั้ง 'y' เพื่อคัดลอกอีกครั้ง
Amjith

@SibbsGambling อาจใช้เวอร์ชันก่อน Vim 7? จากนั้นอัพเกรด Vim หรือใช้ v แทน x ( vnoremap) ไฟล์วิธีใช้ Vim version7.txtระบุ xmap และ smap ปรากฏในเวอร์ชันนั้น
Benoit

1
@Benoit อืมผมมี 7.4.52 แต่ไม่xnoremapว่ามิได้vnoremapงาน
Sibbs พนัน

8
เหตุใดจึงไม่เป็นพฤติกรรมเริ่มต้น ??
Seth

27

"0ควรมีเนื้อหาในการดึงของคุณ การพิมพ์ค่อนข้างน่าเบื่อกว่าเล็กน้อย แต่"0pควรทำในสิ่งที่คุณต้องการ

อีกวิธีหนึ่งอย่าเลือกและแทนที่บรรทัดเก่าไว้ข้างหน้า หากคุณพบบรรทัดเหล่านั้นด้วยการค้นหาเพียงแค่กดn.ซ้ำ ๆ (หลังจากเริ่มต้นp) จากนั้นเมื่อวางทั้งหมดแล้วให้ทำnddตามด้วยn.s มากเท่าที่จำเป็น

สวิตช์ทางจิตที่ใหญ่ที่สุดที่ฉันต้องทำเมื่อย้ายไปที่ Vim คือการหาวิธีใช้การแก้ไขกลุ่มตามลำดับ เช่นแทนที่จะทำการแก้ไขจำนวนมากในบรรทัดแล้วทำการแก้ไขซ้ำ ๆ กันในบรรทัดอื่นฉันจะทำการแก้ไขครั้งแรกในหลายบรรทัด (ใช้.เพื่อเอฟเฟกต์ที่ยอดเยี่ยม) จากนั้นทำการแก้ไขครั้งที่สองในกลุ่ม ของเส้น ฯลฯ หรืออีกวิธีหนึ่งการใช้มาโครอาจช่วยได้เนื่องจากเป็นสิ่งที่ยอดเยี่ยม แต่บางครั้งก็น่าเบื่อกว่าเล็กน้อยในการทำงานอย่างถูกต้องกับการเปลี่ยนแปลงที่ "ซับซ้อน"


2
ดูเหมือนเป็นสถานที่ที่ regex พร้อม:%s/.../.../gcคำสั่งประเภทการยืนยันอาจใกล้เคียงกับสิ่งที่คุณต้องการมากขึ้น
Milimetric

@Milimetric +1 ไม่ทราบว่าคุณสามารถยืนยันเช่นนั้นได้

1
การอัปเกรดเนื่องจากมาโครสามารถทำให้สิ่งนี้ไม่ใช่ปัญหา เพียงทำการแก้ไขครั้งเดียวและคุณสามารถทำสิ่งต่างๆเช่น5@m(สำหรับมาโครที่มีชื่อว่าm)
skatenerd

ขอบคุณสำหรับคำอธิบายที่ดี ตอนนี้ฉันใช้xnoremap p "0pใน ~ /
.vimrc

14

ฉันมักจะใช้รีจิสทรีอื่นคัดลอกบรรทัดที่คุณต้องการไปยังรีจิสทรีที่มีชื่อ"ayแล้ววางจากที่นั่น"ap


11

เมื่อคุณวางทับรายการที่เลือกในกลุ่มจะแทนที่การลงทะเบียนเริ่มต้นด้วยเนื้อหาของการเลือก หากการวางทับส่วนที่เลือกเป็นการลบเนื้อหาของการลงทะเบียนคลิปบอร์ดเป็นไปได้มากว่าคุณจะมีบรรทัดต่อไปนี้ใน. vimrc ของคุณ

set clipboard=unnamed

ทางเลือกหนึ่งคือการลบออกและใช้การลงทะเบียนคลิปบอร์ดที่ชัดเจน "+

อีกทางเลือกหนึ่งคือการใช้รีจิสเตอร์อื่น ๆ ที่มีชื่อชัดเจน (az) หลังจากวางครั้งแรกดึงเส้นกลับเข้าไป"cเช่นแล้วใช้"cpวางจากตรงนั้นออกไป


จริงๆแล้วค่าเริ่มต้น (ที่นี่บน Ubuntu) คือ clipboard = autoselect; ยังคงขอบคุณสำหรับคำตอบที่สวยหรูที่สุดจนถึงตอนนี้
Tobu

7

การใช้งานnpที่nเป็นจำนวนเท่าใดเวลาที่คุณต้องการวางสายเช่น3pจะวาง 3 สาย


10
ไม่ทำงานเมื่อคุณต้องการวางบรรทัดเดียวกันบนบรรทัดที่ไม่ติดกัน
Tobu

@Tobu แต่มันตอบโจทย์ของคำถามนี้ว่า 'คุณวางหลายครั้งได้อย่างไร'
icc97

7

แทนที่จะใช้การคัดลอก / วางมักจะดีกว่าถ้าใช้คำสั่งวัตถุข้อความเช่นciwเปลี่ยนคำภายใน วิธีนี้มีข้อดีคือทำซ้ำได้ง่ายโดยใช้.คำสั่ง repeat

  1. yiw ดึงคำด้านใน (คัดลอกคำใต้เคอร์เซอร์พูดว่า "ก่อน")
  2. ... เลื่อนเคอร์เซอร์ไปที่คำอื่น (พูดว่า "วินาที")
  3. ciw<C-r>0 เปลี่ยน "วินาที" แทนที่ด้วย "แรก" (คือ Ctrl-R)
  4. ... เลื่อนเคอร์เซอร์ไปที่คำอื่น (พูดว่า "ที่สาม")
  5. . เปลี่ยน "ที่สาม" แทนที่ด้วย "แรก"

1
ciw<C-r>0ไม่ได้ผลในกรณีของฉัน ciwเปลี่ยนเป็นโหมดแทรกเมื่อ<C-r>ไม่มีประโยชน์ มีคำอธิบายง่ายๆสำหรับเรื่องนี้หรือไม่? อาจเกี่ยวข้องกับ texteditor (ฉันไม่ได้ใช้ pur VIM แต่การผูกแป้นพิมพ์ VIM ใน RStudio)
Bushroot

@Bushroot <C-r>มีไว้เพื่อใช้ในโหมดแทรกเนื่องจากเป็นวิธีการวางจากรีจิสเตอร์โดยไม่ต้องออกจากโหมดแทรก - ใน Vim นั่นคือ; ฉันไม่คุ้นเคยกับ RStudio แต่ฉันเดาว่าคุณพูดถูกและพวกเขาไม่ได้ใช้การผูกคีย์นี้โดยเฉพาะ
insectean

@Sean H: ครับ พวกเขาไม่ได้ใช้การผูกคีย์ ทำงานได้ดีใน VIM และแม้กระทั่งกับการเชื่อม VIM ในโปรแกรมอื่น ๆ (เช่น Visual Studio Code)
Bushroot
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.