วิธีการตรวจสอบว่าภายในคู่จับคู่?


16

ถาม:มีวิธีทั่วไปในการตรวจสอบว่ามีจุดอยู่ภายในคู่อักขระที่ตรงกันหรือไม่

นั่นคือ: มีฟังก์ชันเพรดิเคตทั่วไป (หรือบางอย่าง) ที่สามารถตัดสินได้ว่าจุดนั้นอยู่ระหว่างคู่ที่จับคู่กันหรือตัวละครที่เลือกโดยพลการหรือไม่? ฉันกำลังคิดเกี่ยวกับสิ่งที่จะประเมินtในพูดสถานการณ์ต่อไปนี้โดย!อ้างถึงประเด็น:

"!"   (quotes in general)
``!'' (LaTeX quotes)
$!$   (LaTeX math)
(!)   (lisp parens)
*!*   (org emphasis)

แก้ไข : syntax-ppssดูเหมือนจะเป็นจุดเริ่มต้นที่ดี แต่ก็ยังไม่ชัดเจนสำหรับฉันว่าจะปรับให้เข้ากับคู่ที่จับคู่แบบหลายตัวละครได้อย่างไร (เช่น '`คำพูดของ LaTeX' หรือแม้กระทั่งจับคู่<b>html tags</b>) ฉันสงสัยว่ามีวิธีแก้ปัญหาทั่วไปหรือไม่หรือต้องใช้เครื่องมือแยกวิเคราะห์

คำตอบ:


16

syntax-ppssอาจช่วยได้ที่นี่ มันคืนรายการที่มีองค์ประกอบเหล่านี้:

  • องค์ประกอบที่ 0: ความลึกเป็นตัวแบ่ง
  • องค์ประกอบ 3: ไม่ใช่ศูนย์หากอยู่ภายในสตริง

คุณสามารถใช้สิ่งนี้:

(or (> (nth 0 (syntax-ppss)) 0)
    (nth 3 (syntax-ppss)))

ด้วยการตั้งค่าตารางไวยากรณ์ในบัฟเฟอร์ (สำหรับสตริงและ parens ที่ตรงกัน) อย่างถูกต้องฟังก์ชันควรทำสิ่งที่คุณคาดหวัง with-syntax-tableหากมีการใช้ไวยากรณ์ตารางโหมดที่เป็นไปไม่ได้มากกว่าที่คุณอาจจะหันไปใช้


ฉันควรชี้ให้เห็นว่า docstring ของparse-partial-sexpอธิบายโครงสร้างข้อมูลที่ส่งกลับมาโดยsyntax-ppssละเอียดมากกว่าส่วน Elisp manual ที่ฉันเชื่อมโยง
paprika

2

หากคุณต้องการตัวอย่างเพื่อตรวจสอบว่าระหว่างวงเล็บปีกกาให้ใช้สิ่งนี้:

(and (looking-back "{") (looking-at "}"))

แน่นอนว่าคุณสามารถแทนที่วงเล็บปีกกาด้วยสิ่งที่คุณต้องการ

แก้ไข:

ฟังก์ชั่นที่มีประโยชน์มากขึ้นจะเป็นสิ่งที่ใกล้กับนี้:

(defun test-inside-curly-braces ()
 (interactive)
 (when (and (looking-back "{\\(.*?\\)") (looking-at "\\(.*?\\)}"))
  (message "inside curly braces")))

2
ที่ทำงานเฉพาะในกรณีที่จุดอยู่บนปิดและไม่มีอะไรระหว่าง} {}การคั่นตัวจับคู่ให้ถูกต้องกับ regexps อาจเป็นเรื่องยุ่งยาก ควรใช้syntax-pps@paprika ดีกว่า
Tyler

@ ไทเลอร์ทำงานได้เฉพาะในกรณีที่จุดปิด}ไม่ใช่พฤติกรรมที่ฉันได้เห็น: \ แต่ใช่รับคู่โดยใช้ regexps เป็นเรื่องยุ่งยากแน่นอน
Nsukami _

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