วิธีแทนที่อักขระมากกว่าหนึ่งตัวโดยไม่ต้องเข้าสู่โหมดแทรก


12

ฉันมีไฟล์ที่มีบรรทัดที่มีลักษณะดังนี้:

foofoo.xy.barbar

ฉันต้องการที่จะเปลี่ยนไปxy ghฉันพยายามทำ2r-> ghแต่เห็นได้ชัดว่าไม่ได้ผลเพราะมันแทนที่xyด้วยggแล้วเลื่อนเคอร์เซอร์ไปทางซ้ายหนึ่งจุด

มีวิธีการนี้หรือไม่โดยไม่ต้องเข้าสู่โหมดแทรกหรือไม่ใช้การกดแป้นมากขึ้น (เช่น:s/xy/gh/)?


2
Rเข้าสู่โหมดแทนที่ :help replace-modeสำหรับข้อมูลเพิ่มเติม.
alxndr

ฉันพยายามvt.rghแล้ว แต่ผลลัพธ์ก็เหมือนกับของคุณยกเว้นตำแหน่งเคอร์เซอร์
Gonçalo Ribeiro

2
ทำไมคุณไม่ต้องการเข้าสู่โหมดแทรก? บางสิ่งที่เหมือนcwgh<esc>จะใช้ได้ดี
Doorknob

1
@ durron597 ฉันไม่แน่ใจว่าminimize-keystrokesเป็นแท็กที่ดีหรือไม่ก็มักจะไม่ใช่คำถามที่เกี่ยวกับเช่นนี้ (ฉันปฏิเสธการแก้ไขที่เสนอของคุณ) ... บางทีคุณควรพูดคุยที่เมตา
Martin Tournoij

คำตอบ:


19

หากข้อความใหม่มีความยาวเท่ากับข้อความเดิมโหมดการแทนที่ของ Vim จะเป็นตัวเลือก จากโหมดปกติR(นั่นคือตัวใหญ่ "r") จะนำคุณเข้าสู่โหมดแทนที่ สิ่งนี้คล้ายกับ "เขียนทับ" ในเครื่องมือแก้ไขข้อความอื่น ๆ : แทนที่จะใส่ตัวอักษรใหม่เช่นในโหมดแทรกการพิมพ์จะแทนที่อักขระที่อยู่ใต้เคอร์เซอร์แล้วเลื่อนไปที่เคอร์เซอร์ถัดไป (คิดว่ามันเหมือนกรณีที่ต่ำกว่าrแต่สำหรับมากกว่าเพียงแค่ตัวเดียวในเวลา.) :help replace-modeหาเอกสารสำหรับโหมดเปลี่ยน

ในกรณีของคุณ: ด้วยเคอร์เซอร์ระหว่าง.และได้รับเข้ามาแทนที่โหมดโดยการกดx Rตอนนี้เมื่อคุณพิมพ์gมันจะแทนที่ "x" และย้ายไปยังอักขระถัดไปดังนั้นคุณสามารถพิมพ์hเพื่อแทนที่ "y" การแก้ไขของคุณเสร็จสิ้นแล้วดังนั้นEscapeเพื่อกลับสู่โหมดปกติ

(ใช้งานได้เมื่อข้อความการแทนที่ของคุณมีความยาวเท่ากันกับข้อความเก่า แต่หากการแทนที่ของคุณยาวหรือสั้นกว่าcอาจเป็นสิ่งที่คุณต้องการ: มันจะแทนที่1ข้อความภายในการเคลื่อนไหวด้วยข้อความที่คุณพิมพ์แล้ว หลายวิธีที่จะใช้cตัวอย่างเช่น: ด้วยเคอร์เซอร์ระหว่าง.และx, ct.ABCEscapeพูดกับ hange ข้อความ (ขึ้น ' Tอิลลินอยส์ถัดไป.) ด้วย 'เอบีซี').


1มันจะดึงข้อความในการเคลื่อนไหวไปยังชื่อที่ไม่ได้ / "ลงทะเบียนแล้วเปลี่ยนเป็นโหมดแทรกเพื่อให้คุณสามารถพิมพ์บางสิ่งเพื่อแทนที่มันแล้วEscapeกลับสู่โหมดปกติ


2
ใช้งานได้กับกรณีนี้ ถ้าคุณต้องการแทนที่ 2 ตัวอักษรเหล่านั้นโดยพูด 3 ตัวอักษร?
Gonçalo Ribeiro

1
คำถามที่ดี; แก้ไขรวมถึงวิธีการจัดการข้อความความยาวที่แตกต่างกัน
alxndr

ใช่ฉันรู้แบบนั้น แต่วิธีการที่คุณเข้าสู่โหมดแทรกและฉันอยากรู้ว่าจะมีวิธีที่จะไม่ใช้โหมดแทรกในกรณีนั้นหรือไม่ ไม่ใช่ว่าฉันคิดว่ามันมีประโยชน์มาก (แต่ฉันอาจผิด)
Gonçalo Ribeiro

1
คำนำหน้าด้วยตัวเลขnเพื่อแทนที่ถึงn-th ของอักขระเป้าหมาย นี้จะเป็นประโยชน์สำหรับการเปลี่ยนชิ้นส่วนของป้ายที่มีรูปแบบและw_x_y_z a-b-c-dใช้fแทนtการลบอักขระที่ จำกัด เช่นกัน
pkfm

5

มีสองวิธีที่คุณสามารถทำได้ แต่สิ่งที่ง่ายที่สุดที่ฉันคิดได้คือ:

TL; DR

fxcw<REPLACEMENT TEXT>

คำอธิบาย

  • fxข้ามคุณไปที่ x (ดูhelp *f*)
  • cwบอกว่าจะเปลี่ยนคำว่า (ดู:h *c*, :help *w*และ:help cwสำหรับข้อมูลเพิ่มเติม) เอา "เซ็กซี่" ข้อความและเข้าสู่โหมดแทรกให้คุณใส่สิ่งที่คุณต้องการอยู่ที่นั่น
  • <REPLACEMENT TEXT> คือสิ่งที่คุณต้องการแทนที่ด้วย - "gh" ในตัวอย่างของคุณ

ข้อดีอย่างหนึ่งของวิธีนี้คือใช้คำสั่งการจัดการข้อความและการนำทางที่ใช้กันอย่างแพร่หลาย อีกอย่างคือ "xy" อาจมีความยาวเท่าใดก็ได้และสิ่งนี้จะยังคงใช้ได้

cwงานเนื่องจากวัตถุข้อความของคุณถูกล้อมรอบด้วยระยะเวลา ( .) ซึ่งทำหน้าที่เป็นเขตแดนเพื่อคำว่า

หากเคอร์เซอร์ของคุณอยู่แล้วที่ "Y" ตัวอักษร (หรือตัวอักษรใด ๆ ในข้อความจะถูกแทนที่), ciw<REPLACEMENT TEXT>คุณสามารถใช้ สิ่งนี้จะบอกให้สมาชิกเปลี่ยนคำที่คุณใช้แม้ว่าคุณจะไม่ได้อยู่ที่จุดเริ่มต้นก็ตาม ดู:help text-objectsข้อมูลเพิ่มเติมเกี่ยวกับciwและวัตถุข้อความโดยทั่วไป


สิ่งนี้จะไม่ทำให้เขาอยู่ในโหมดแทรกหรือ
elyashiv

1
อ่า - ไม่ได้เป็นส่วนหนึ่งของคำถามของเขา ในกรณีนั้นใช่ - R เป็นทางออกที่เหมาะสมที่สุด
Cody Poll

3

แทนที่โหมด:

Rgh<Esc>

เป็นทางออกที่ชัดเจนที่สุดหากการเปลี่ยนมีความยาวเท่าเดิม แต่คุณสามารถทำได้เช่นกัน:

2sgh<Esc>

หรือ:

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