ตัวเลือกทดแทนหลายรายการ?


15

โดยปกติcตัวเลือกทดแทนจะให้ฉันสองตัวเลือก: (y) es หรือ (n) o เป็นไปได้ไหมที่จะมีตัวเลือกใช่ที่มีให้เลือกหลายหมายเลข?

ตัวอย่าง

ไฟล์

person: Alice
dog: Tobby
person: Bob

รูปแบบ 1 :%s/person:/woman:/c

รูปแบบ 2 :%s/person:/man:/c

รูปแบบที่ 1 และ 2 มีรูปแบบการค้นหาเดียวกัน แต่รูปแบบการแทนที่ที่แตกต่างกัน ฉันต้องการรวมไว้ในรูปแบบเดียวด้วยตัวเลือกในการกด (1) เพื่อทดแทน 1, (2) สำหรับการแทนที่ 2 หรือ (n) โดยไม่มีการแทนที่

คำตอบ:


19

การดำเนินการของ:s//cได้รับการแก้ไข; สิ่งที่คุณกำลังมองหาคือการแทนที่ด้วยนิพจน์ Vimscript ( :help sub-replace-expr) คุณสามารถค้นหาตัวเลขหลักเดียวผ่านทางgetchar()หรือแจ้งให้มีหมายเลขที่ยาวขึ้นผ่านinput():

:%s/person:/\=get(['woman', 'man'], getchar() - char2nr(1), submatch(0)) . ':'/
:%s/person:/\=get(['woman', 'man'], input('Your choice: ') - 1, submatch(0)) . ':'/

คุณสามารถป้อนหมายเลขที่สูงขึ้น ( 3ในตัวอย่างของคุณ) เพื่อไม่ทำการแทนที่


หากคุณต้องการสิ่งนี้บ่อยครั้งมันจะสมเหตุสมผลที่จะกำหนดQuery()ฟังก์ชั่นที่กำหนดเองสำหรับสิ่งนั้น ในนั้นคุณสามารถเพิ่ม a :redrawเพื่อที่คุณจะได้เห็นสิ่งทดแทนที่เกิดขึ้นแล้ว


คำสั่งดูเหมือนว่ามีปัญหา หลังจากฉันเพิ่มคำสั่งตรวจสอบแล้วก็ใช้งานได้::%s/person:/\=get(['woman', 'man'], input('Your choice: ') - 1, submatch(0)) . ':'/c
Lerner Zhang

แต่เพิ่มcคำสั่งจะส่งผลให้ฉันต้องการสองขั้นตอนเพื่อแทนที่สตริงซึ่งฉันคิดว่าไม่มีความจำเป็น
Lerner Zhang

1

ขอบคุณสำหรับ upvotes ทั้งหมดกับคำถามเดิมของฉัน! ตอนนี้ฉันได้รวม:SubstituteChoicesคำสั่งไว้ในปลั๊กอิน PatternsOnTextของฉันซึ่งให้การใช้งานที่มีประสิทธิภาพ ตัวอย่างในคำถามจะได้รับการแก้ไขผ่าน:

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