บ่อยครั้งที่ฉันพบว่าตัวเองพยายามที่จะเข้ามาแทนที่เช่นfooด้วยbarและbarด้วยfooในกันชน
วิธีที่ฉันทำตามปกติคือ:
- 3 แบบสอบถามแทนที่:
aaa -> @@@,bbb -> aaa,@@@ -> bbb - ยอมแพ้ในระบบอัตโนมัติและทำการทดแทนด้วยมือ
ฉันคิดว่ามันเป็นไปได้ที่จะได้รับสิ่งที่ทำงานโดยใช้,ไวยากรณ์ในquery-replace-regexpการทดสอบว่าสตริงที่ตรงกันaaaหรือbbbไม่ แต่ไวยากรณ์ที่เกิดขึ้นจะยุ่งยากเกินไปดังนั้นฉันไม่เคยลองเลย
สิ่งที่ได้รับคือความธรรมดาของงานฉันคิดว่าต้องมีขั้นตอนที่ดีกว่าขั้นตอนเดียวในการทำไม่ว่าจะเป็นในตัวหรือในแพ็คเกจที่มีอยู่ มีอะไรบ้าง
อาจมีขั้นตอนเดียว แต่วิธีแรกของคุณไม่เลว IMO และถ้าคุณเลือกสตริงการแทนที่ที่ถูกต้องคุณก็สามารถทำการแทนที่แบบไม่มีเคียวรีสำหรับรอบที่สองได้
—
ดึง
@ ดึงสำหรับปกติ
—
T. Verron
query-replaceฉันรู้ว่ามันมักจะเร็วM-% str1 str2กว่าที่จะย้ายจุดและทำการเปลี่ยนแปลงด้วยมือ str1มันเป็นเรื่องดีเพราะผมจะได้ไม่ต้องเสียเวลาคิดเกี่ยวกับสิ่งที่จะเป็นเร็วที่สุดแม้ว่าจะมีเพียงคนเดียวคือการเกิดขึ้นของ เป็นการดีที่ฉันต้องการให้การส่งข้อความเป็นไปอย่างรวดเร็วเพื่อให้ฉันสามารถใช้งานได้โดยไม่ต้องคิดเช่นกัน
บางคนจะให้คำตอบง่ายๆ คุณไม่ต้องสงสัยเลยว่าทำสิ่งที่คุณถามเช่นโดยใช้นิพจน์เสียงกระเพื่อมสำหรับการแทนที่โดยอ้างอิงข้อความที่จะถูกแทนที่
—
ดึง
(setq a (prog1 b (setq b a)))เช่นการใช้สิ่งที่คล้ายกับสำนวนการแลกเปลี่ยน และอาจมีวิธีที่ง่ายกว่า
ฉันไม่พบว่า
—
politza
\,(if \1 "b" "a")น่าเกลียดโดยเฉพาะอย่างยิ่ง (เทียบกับ regexp ของ\(a\)\|b) แต่ยังคงต้องพิมพ์คำสองครั้งถ้าที่รบกวนจิตใจคุณ
ทำไมไม่
—
politza
\(aaa\)\|bbb?