วิธีการเลือกเปลี่ยนสตริงไฮไลต์


11

ด้วยการค้นหาฉันได้เน้นสตริงที่ฉันต้องการเปลี่ยน ตอนนี้ฉันต้องการแทนที่เฉพาะข้อความที่เน้นสี ฉันใช้nเพื่อไปยังอินสแตนซ์ถัดไปของสตริงการค้นหา ฉันคิดว่าฉันสามารถทำอะไรบางอย่างเช่นciwแต่เปลี่ยนคำทั้งหมดไม่ใช่แค่ข้อความที่เน้นสี

ฉันคุ้นเคย:%s/old/new/gแต่ไม่ต้องการเปลี่ยนอินสแตนซ์ทั้งหมด แต่ฉันต้องการเลื่อนเคอร์เซอร์ไปที่แต่ละอินสแตนซ์แล้วตัดสินใจว่าจะเปลี่ยนหรือไม่

คำตอบ:


16

ใช้การgnเคลื่อนไหวเพื่อแก้ไขการค้นหาที่ตรงกันปัจจุบัน ตัวอย่างต่อไปนี้จะเปลี่ยนการจับคู่ปัจจุบันเป็น "FooBar":

cgnFooBar

.ส่วนที่ดีเกี่ยวกับเทคนิคนี้คือการที่คุณสามารถทำซ้ำการเปลี่ยนแปลงทาง สมมติว่าการแข่งขันนัดต่อไปจะมีการเปลี่ยนแปลงในลักษณะเดียวกับที่คุณสามารถใช้.ซ้ำได้ หรือข้ามการแข่งขันไม่กี่ผ่านแล้วใช้n.

Vimcastsมีตอนที่ดีในเรื่องนี้: ปฏิบัติการค้นหาโดยใช้ gn

สำหรับความช่วยเหลือเพิ่มเติมดู:

:h gn

วิธีนี้เป็นวิธีที่แน่นอนเมื่อคุณมีสตริงการแทนที่ที่แตกต่างกันซึ่งคุณต้องใช้ในที่ต่างๆ ฉันไม่แน่ใจเกี่ยวกับความแตกต่างของโหมดภาพที่ดูเหมือนว่าจะถูกเรียกโดยgnดังนั้นนี่เป็นวิธีการที่คล้ายกันที่ฉันเพิ่งค้นพบ:c//e<CR>FooBar<Esc>//<CR>
Jeff

มีวิธีในการเปลี่ยนการเลือก / การแข่งขันทั้งหมดในครั้งเดียวหรือไม่? โดยทั่วไปเพื่อ refactor?
Geremia

@Geremia ใช่:%s/oldtext/newstuff/gจะมีการเปลี่ยนแปลงการแข่งขันทั้งหมดของการoldtext newstuff
zundarz

@zundarz ฉันไม่ต้องการทำ regexp แต่เพื่อแทนที่ชื่อตัวแปรเท่านั้น แทนที่จะกดปุ่ม.หลายครั้งฉันสามารถใช้:%norm .(ที่มา )
Geremia

7

หากคุณมีการสืบค้นแล้วสำหรับคำที่มีหรือ/word?word

คุณสามารถใช้:%s//newword/gcเพื่อแทนที่คำที่คุณค้นหาก่อนหน้านี้ด้วยnewwordโดยปล่อยให้คำค้นหา ( s//..) ว่างเปล่า

cธงกล่าวว่าการเปลี่ยนแปลงทุกครั้งควรจะได้รับการยืนยันโดยการกดyสำหรับใช่หรือnไม่

ดู:help :s_flagsข้อมูลเพิ่มเติมเกี่ยวกับการยืนยันการตั้งค่าสถานะ


1
ฉันรู้ว่าคุณกล่าวว่าจะมองไปที่ความช่วยเหลือ แต่คุณอาจรวมทั้งชัดพูดถึงคุณยังสามารถกดl, aและq(หรือ<Esc>) สำหรับวิธีการต่างๆเพื่อห่อรอบการยืนยัน
Jeff

2

วิธีที่ # 1

คุณสามารถใช้ประโยชน์จากgnและgNการแมปเพื่อบรรลุสิ่งที่คุณต้องการ gnจะค้นหาข้อความค้นหาที่ใช้ล่าสุดและเลือกการจับคู่ gNทำสิ่งเดียวกันทุกประการยกเว้นค้นหาย้อนหลัง เมื่อรวมกับโอเปอเรเตอร์เช่นcโอเปอเรเตอร์จะถูกนำไปใช้กับการแข่งขันตัวอย่างเช่นหากสตริงการค้นหาล่าสุดของคุณคือ "foo" และคุณพิมพ์cgnมันจะค้นหาต่อไปสำหรับอินสแตนซ์ถัดไปของ "foo" ลบและ ใส่คุณในโหมดแทรกเพื่อป้อนข้อความการแทนที่

สำหรับข้อมูลเพิ่มเติมเกี่ยวเหล่านี้ให้ดูและ:help gn:help gN

วิธีที่ # 2

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

:%s/foo/bar/gc

สำหรับข้อมูลเพิ่มเติมเกี่ยวกับเรื่องนี้ดูหัวข้อความช่วยเหลือเหล่านี้: :help :s_flags, และ:help cmdline-ranges:help :substitute

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