จริงๆแล้วมีสี่ที่แตกต่างกัน re-builder
ตัวเลือกไวยากรณ์ที่ตัวและคุณสามารถสลับระหว่างกันได้C-cTAB
สองอย่างคือคอมไพเลอร์ regexp ของ sexp-form rx
และsregex
(แต่เนื่องจากในอดีตนั้นมีความครอบคลุมมากกว่าและสามารถใช้กับไวยากรณ์ได้เกือบทั้งหมดคุณสามารถละเว้น sregex ได้เว้นแต่คุณจะใช้รหัสเก่าที่ใช้)
อีกสองตัวเลือกไวยากรณ์คือread
(ค่าเริ่มต้น) และstring
(ซึ่งเป็นไวยากรณ์ที่คุณใช้แบบโต้ตอบ)
read
ไวยากรณ์คือ 'รหัส' ไวยากรณ์ - คือเป็นที่ยอมรับโดยผู้อ่านกระเพื่อม - การที่คุณป้อน regexp ตามความไวยากรณ์การอ่านสำหรับสตริง :
C-hig (elisp) Syntax for Strings
RET
string
ไวยากรณ์ (ซึ่งผมได้พิจารณาเสมอชื่อโดยไม่จำเป็นทำให้เกิดความสับสนในบริบทนี้) เป็นไวยากรณ์ของสตริงแสดงออกปกติซึ่งได้รับการอ่านอยู่แล้วและที่จึงไม่ได้มีของตัวละครหนีจำเป็นเมื่อเขียนสตริง นี่คือไวยากรณ์การแสดงออกปกติจริงเช่นเดียวกับที่คุณใช้เมื่อ Emacs แจ้งให้คุณโต้ตอบ
หากคุณต้องการใช้ไวยากรณ์สตริงโดยค่าเริ่มต้นให้เพิ่มสิ่งต่อไปนี้ในไฟล์ init ของคุณหรือใช้ M-x customize-option
RET reb-re-syntax
RET
(setq reb-re-syntax 'string)
โปรดทราบว่าคุณสามารถสลับไปมาระหว่างการอ่านและไวยากรณ์สตริงเมื่อแก้ไข regexp โดยไม่สูญเสียข้อมูล คุณยังสามารถเปลี่ยนจากรูปแบบ sexp เป็น read / string syntax (โดยปกติแล้วการคอมไพล์ sexps เป็นสตริงนั้นเป็นสิ่งที่ไลบรารี่เหล่านั้นใช้) แต่คุณไม่สามารถไปในทิศทางอื่นและสร้าง sexp จากสตริง ผู้สร้างซ้ำจะจดจำว่า sexp นั้นคืออะไรดังนั้นคุณจะไม่เสียรูปแบบนั้นเมื่อคุณเปลี่ยนไวยากรณ์ แต่ยังไม่ได้รับการปรับปรุงหากคุณแก้ไข regexp ในรูปแบบที่แตกต่างกันแล้วเปลี่ยนกลับ กล่าวโดยย่อหากคุณกำลังสร้าง regexp เป็น sexp ตรวจสอบให้แน่ใจว่าคุณแก้ไขได้เฉพาะในขณะที่ใช้ไวยากรณ์นั้น
gotcha พร้อมการrx
รองรับคือการใช้งานrx-to-string
ฟังก์ชั่นซึ่งไม่เหมือนกับการใช้rx
มาโครในโค้ด rx
ยอมรับจำนวนข้อโต้แย้งของรูปแบบโดยพลการและถือว่าเป็นลำดับโดยนัยในขณะที่rx-to-string
ยอมรับเพียงรูปแบบเดียวและลำดับระดับบนสุดใด ๆ จะต้องชัดเจน'(sequence ...)
หรือเทียบเท่า
ในระยะสั้นเมื่อคุณป้อนแบบฟอร์ม'(...)
ในการสร้างใหม่มันจะถูกประมวลผลเป็น(rx-to-string '(...))
และไม่(rx ...)
นอกจากนี้โปรดทราบว่ารูปแบบที่ไม่ถูกต้องอาจทำให้re-builder
หยุดการปรับปรุงการแข่งขันในบัฟเฟอร์ที่เกี่ยวข้องแบบไดนามิกแม้ว่าจะทำให้ฟอร์มถูกต้องอีกครั้ง การC-cC-uเชื่อมโยงสำหรับreb-force-update
มีประโยชน์สำหรับการแก้ไขสถานการณ์เหล่านี้
โดยค่าเริ่มต้นบรรทัดโหมดจะแสดง "ตัวสร้าง RE" เมื่อใช้read
หรือstring
ไวยากรณ์และ "RE Builder Lisp" เมื่อใช้rx
หรือsregex
ไวยากรณ์ แต่ดูเหมือนว่ามีประโยชน์มากกว่าที่จะระบุเฉพาะไวยากรณ์ใช้งานอยู่ (โดยเฉพาะเพื่อแยกความแตกต่างระหว่างread
และstring
)
หากคุณติดตั้งdelight
แพคเกจจาก GNU ELPA คุณสามารถใช้รายการต่อไปนี้เพื่อเพิ่มตัวบ่งชี้ไวยากรณ์ในบรรทัดโหมด
(let ((name '("Regexp[" (:eval (symbol-name reb-re-syntax)) "]")))
(delight `((reb-mode ,name :major)
(reb-lisp-mode ,name :major))))
สิ่งนี้จะเปลี่ยนชื่อโหมดเป็น "Regexp [read]" ใน read
รูปแบบไวยากรณ์และในทำนองเดียวกันสำหรับคนอื่น ๆ
หรือหากต้องการรวมคำใบ้สำหรับrx
vs rx-to-string
gotcha ที่อธิบายไว้ข้างต้นให้บรรทัดโหมดพูดว่า "Regexp [rx-to-string]" เมื่อใช้rx
ไวยากรณ์:
(let ((name '("Regexp["
(:eval (symbol-name (if (eq reb-re-syntax 'rx)
'rx-to-string
reb-re-syntax)))
"]")))
(delight `((reb-mode ,name :major)
(reb-lisp-mode ,name :major))))