ฉันจะวาง (เขียนทับ) ด้วยเสียงเรียกเข้าได้อย่างไร?


31

ในvimฉันใช้yyและpตลอดเวลาที่จะดึงและวางสาย อย่างไรก็ตามหากฉันต้องการแทนที่หนึ่งบรรทัดหลายแห่งในไฟล์ฉันไม่สามารถใช้ได้yy p dd pเพราะdd ลบบรรทัดไปยังคลิปบอร์ด / ลงทะเบียน ในขณะที่ฉันควรจะรู้วิธีใช้รีจิสเตอร์ดีกว่า แต่ฉันรู้สึกว่าอาจมีวิธีpที่จะแทนที่บรรทัดปัจจุบันได้

คำตอบ:


27

โดยค่าเริ่มต้นคำสั่งวางใช้"(“ชื่อ”) ลงทะเบียน ได้อย่างมีประสิทธิภาพคำสั่งใด ๆ ที่เขียนไปยังการลงทะเบียนยังเขียนไปยังการลงทะเบียนที่ไม่มีชื่อดังนั้น yanks ลบและการเปลี่ยนแปลงทั้งหมดที่มีผลต่อมัน นี่คือเหตุผลที่ลำดับ yank-delete-paste ของคุณวางข้อความที่ถูกลบแทนที่ข้อความ yanked

การ0ลงทะเบียนสามารถช่วยได้ที่นี่ คำสั่ง yank ใด ๆ ที่ไม่ได้ระบุรีจิสเตอร์จะใส่ข้อความ yanked ในรีจิสเตอร์0(นอกเหนือจาก") จะไม่ได้รับผลกระทบจากการลบหรือเปลี่ยนการดำเนินการดังนั้นคุณสามารถใช้มันเพื่อวางสาย yanked หลายครั้งแม้ว่าคุณจะลบหรือเปลี่ยนแปลงกลาง

  1. yy: รีจิสเตอร์0และ"ทั้งคู่ตอนนี้มีสาย yanked
  2. ย้ายไปที่บรรทัดเพื่อแทนที่
  3. dd: การลงทะเบียน"ตอนนี้มีบรรทัดที่ถูกลบ แต่การลงทะเบียน0ยังคงมีบรรทัดที่ถูกดึง
    "0P: 0วางสายกระชากเดิมจากการลงทะเบียน
  4. ย้ายไปที่บรรทัดถัดไปเพื่อแทนที่
  5. dd"0P (เหมือนด้านบน)

(เนื่องจากตำแหน่งเคอร์เซอร์ทำงานเมื่อเปลี่ยนบรรทัดสุดท้ายของบัฟเฟอร์คุณจะต้องการใช้"0pแทน"0P)

นี่ใกล้กับคำตอบของ Bruce Edigerมากยกเว้นว่าคุณไม่จำเป็นต้องระบุการลงทะเบียนเมื่อเริ่มเล่น การใช้รีจิสเตอร์ที่กำหนดชื่อตั้งแต่หนึ่งรายการขึ้นไปนั้นมีประโยชน์มากแม้ว่าคุณจะต้องการ (ตัวอย่าง) แทนที่บางบรรทัดด้วยAAAแต่บรรทัดอื่น ๆ ที่มีBBB(ใส่AAAในรีจิสเตอร์aและBBBในรีจิสเตอร์b(หรือทิ้งไว้ในรีจิสตรี0) )

นอกจากนี้คุณยังสามารถวางจาก0ในโหมดภาพเส้นที่ชาญฉลาด ( V) V"0pเพื่อบันทึกการกดแป้นพิมพ์:

หากคุณไม่ต้องการพิมพ์"0คุณอาจพบว่าการทำแผนที่สะดวกกว่า:

noremap <Leader>p "0p
noremap <Leader>P "0P
vnoremap <Leader>p "0p

วิธีอื่นคือการลบไป_(“ต้องห้าม”) ลงทะเบียน เมื่อคุณลบมันการ"ลงทะเบียนจะไม่ได้รับผลกระทบดังนั้นลำดับ yank-delete-paste ของคุณยังสามารถวางข้อความ yanked จากการลงทะเบียนที่ไม่มีชื่อ

  1. yy: ลงทะเบียน0และ"ตอนนี้ทั้งคู่มีสาย yanked
  2. "_dd: ไม่มีการเปลี่ยนแปลงทะเบียน
    P: "วางข้อความกระชากเดิมจากการลงทะเบียน

อีกครั้งคุณอาจพบว่าการทำแผนที่สะดวกกว่า:

noremap <Leader>d "_d

2
หรือ TL; DR เพียงแค่ใช้(ย้ายไปสายจะถูกแทนที่)yy S<C-r>0<Esc>มีข้อได้เปรียบในการทำซ้ำด้วย.คำสั่ง
Wildcard

11

ดูเหมือนว่า Kevin จะมีคำตอบที่ดีงาม แต่ถ้าคุณต้องการจับตามองในแต่ละบรรทัดที่คุณลบออกแล้วแทนที่จะมีวิธีแก้ปัญหาที่แตกต่างออกไปเล็กน้อย

1. Find line to copy in some select number of places.
2. Put cursor on it.
3. "ayy copies that line into register 'a'.
4. Find line to replace. Put cursor on it.
5. dd deletes that line. "aP inserts the copied line above where the cursor now lies.
6. Repeat steps 4 and 5.

สูตรอาหารประเภทนี้ช่วยให้คุณใช้การจับคู่รูปแบบเพื่อค้นหาบรรทัดที่จะลบและแทนที่และคุณสามารถกลับไปที่จุดเริ่มต้นของไฟล์ (1G) และค้นหาไปข้างหน้าได้บ่อยเท่าที่คุณต้องการ หากฉันมี 2 หรือมากกว่าบรรทัดที่จะรวบรวมและวางซ้ำฉันจะใช้"ayyสำหรับบรรทัดแรก"byyสำหรับที่สอง"cyyสำหรับที่สามและอื่น ๆ ฉันสร้างนิสัย (ซึ่งช่วยลดความเป็นสูตรทั่วไป) เพื่อลดภาระทางจิตของฉัน


ดีมาก. ดังนั้นถ้าผมใช้"ayyแล้วdd, ddจะไม่แทนที่สิ่งที่อยู่ในaแต่ถ้าผมพิมพ์มันจะวางสิ่งที่ถูกลบไปแล้วเพียงแค่ใช้p ddและถ้าฉันต้องการแทนที่สิ่งที่อยู่ใน"ayyสิ่งที่ฉันกำลังลบไปฉันก็จะใช้"add- ใช่ไหม?
cwd

"ayy คัดลอกบรรทัดลงทะเบียน 'a'." dd "ตัดบรรทัดลงทะเบียนเริ่มต้นไม่ใช่ 'a'. 'p' วางการลงทะเบียนเริ่มต้นถูกต้องและใช่" เพิ่มการตัดบรรทัดลงในการลงทะเบียน 'a' ซึ่งจะแทนที่เนื้อหาจากคำสั่ง "ayy
Bruce Ediger

5

มีสองสามวิธีในการทำเช่นนี้:sขึ้นอยู่กับจำนวนที่คุณต้องการพิมพ์ วิธีที่ง่ายที่สุดคือการค้นหาและแทนที่:

:%s/find this line/replace with this/

%จะค้นหาไฟล์ทั้งหมดและแทนที่เกิดขึ้นทั้งหมด

หากคุณพิมพ์มากเกินไปคุณสามารถดึงสตริงปลายทาง ( yy) และใช้การ"ลงทะเบียน (ค่าเริ่มต้น) แทรกด้วยCtrl+r ":

:%s/<ctrl+r><">/replacement/

หรือถ้าคุณมีสำเนาของสตริงการแทนที่คุณสามารถดึงทั้งสองลงในการลงทะเบียนแยกด้วย"ayyและ"byyเพื่อดึงลงในaและbลงทะเบียนตามลำดับ (คุณสามารถใช้จดหมายใด ๆ สำหรับการลงทะเบียนของคุณ) จากนั้นใช้Ctrl+r aและCtrl+r bวางลงในการค้นหาและแทนที่ฟิลด์

ไม่ใช่สำหรับ Bruce one-up แต่ถ้าคุณต้องการตรวจสอบบรรทัดก่อนที่จะแทนที่พวกเขาเพียงเพิ่มcตัวเลือก:

:%s/find this line/replace with this/c

2

คุณสามารถใช้Vเพื่อเน้นบรรทัดที่คุณต้องการแทนที่ในโหมดภาพจากนั้นกดppเพื่อวางทับบรรทัดนั้น

นี่เป็นการเพิ่มการกดแป้นพิมพ์เพียงครั้งเดียวเท่านั้นดังนั้นจึงดูเหมือนเป็นทางออกที่ดีทีเดียว


สิ่งนี้ไม่ทำงาน: หลังจากวางแล้วคลิปบอร์ดมีข้อความที่ถูกทำเครื่องหมายโดยV
daniel kullmann

pเพียงแค่คนเดียว
Aaron Thoma

2

ฉันใช้c, "เปลี่ยน", คำสั่งค่อนข้างบ่อยสำหรับสิ่งนี้รวมกับการค้นหาปกติ คุณสามารถค้นหาไฟล์สำหรับแต่ละบรรทัด / ชิ้นส่วนของข้อความที่คุณสนใจแล้วใช้n.คำสั่งที่ต่อเนื่องกัน( nสำหรับคำสั่งถัดไปจากนั้น.ทำซ้ำการเปลี่ยนแปลงล่าสุด)

/^hello- ค้นหาบรรทัดที่ขึ้นต้นด้วย hello;
c$goodbye- เปลี่ยนสายเป็นลาก่อน;
n.- ค้นหาซ้ำทำซ้ำเปลี่ยนแปลง

หากคุณต้องการเปลี่ยนบรรทัดเป็นไฟล์ที่มีอยู่แล้วในไฟล์คุณสามารถคัดลอกลงในบัฟเฟอร์อินพุตของคุณ (สมมติว่า GUI อนุญาตให้มัน) แล้ววางเพื่อรับเนื้อหาของคำสั่งเปลี่ยนแปลงครั้งแรก

เช่นเดียวกับทุกสิ่งที่ vi มันเป็นความคิดที่ดีที่จะมีตัวเลือกมากมายในกระเป๋าของคุณทั้งนี้ขึ้นอยู่กับประเภทของการแก้ไขที่คุณต้องการทำ

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