บ่อยครั้งที่ฉันพบว่าตัวเองพยายามที่จะเข้ามาแทนที่เช่น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
?