ต่อไปนี้เป็นเหมือนความคิดเห็นตั้งแต่
- มันแก้ไขได้เพียงส่วนเล็ก ๆ ของปัญหา (
rainbow-delimiters-mode
)
- มันไม่ได้ทดสอบอย่างละเอียด (เพียงแค่มีไฟล์ลาเท็กซ์หนึ่งไฟล์)
- ฉันไม่เข้าใจว่าทำไมมันถึงทำงาน
font-lock-mode
ได้จริง ๆ( เป็นเครื่องจักรที่ซับซ้อนจริงๆ)
ตอนแรกทางออกสำหรับrainbow-delimiters-mode
:
เราเปลี่ยนคุณสมบัติข้อความfont-lock-face
จากface
ในและrainbow-delimiters-propertize-delimiter
rainbow-delimiters-unpropertize-delimiter
เนื่องจากdefsubst
ใช้ในแพ็คเกจแทนdefun
เราไม่สามารถใช้งานได้defalias
แต่ต้องแก้ไขฟังก์ชั่นของตัวเอง (เท่าที่ฉันเข้าใจ - โปรดแสดงความคิดเห็นหากฉันผิดในเรื่องนี้)
ฟังก์ชั่นการแก้ไขคือ:
(defsubst rainbow-delimiters-propertize-delimiter (loc depth)
"Highlight a single delimiter at LOC according to DEPTH.
LOC is the location of the character to add text properties to.
DEPTH is the nested depth at LOC, which determines the face to use.
Sets text properties:
`font-lock-face' to the appropriate delimiter face.
`rear-nonsticky' to prevent color from bleeding into subsequent characters typed by the user."
(with-silent-modifications
(let ((delim-face (if (<= depth 0)
'rainbow-delimiters-unmatched-face
(rainbow-delimiters-depth-face depth))))
;; (when (eq depth -1) (message "Unmatched delimiter at char %s." loc))
(add-text-properties loc (1+ loc)
;; 2015-05-24: Changed font-lock-face to face to enable rainbow after syntax fontification in latex-mode
;; (see http://emacs.stackexchange.com/questions/4260/how-to-get-rainbow-delimiters-rainbow-blocks-to-highlight-in-line-math-in-latex)
`(face ,delim-face
rear-nonsticky t)))))
(defsubst rainbow-delimiters-unpropertize-delimiter (loc)
"Remove text properties set by rainbow-delimiters mode from char at LOC."
(with-silent-modifications
(remove-text-properties loc (1+ loc)
;; 2015-05-24: See corresponding line in `rainbow-delimiters-propertize-delimiter'.
'(face nil
rear-nonsticky nil))))
ตอนนี้เหตุผล:
สูตรฝังตัวระหว่าง $ -delimiters เป็นไวยากรณ์แบบอักษรโดยแบบอักษร - ล็อค - โหมด (ตามที่คิริลล์ชี้ไปแล้ว) การลงทะเบียนของแบบอักษรนี้ดูเป็นปกติ (ดูตัวแปรfont-lock-syntactic-face-function
และฟังก์ชั่นfont-latex-syntactic-face-function
) แต่describe-char
ที่ตัวละครของฝังตัวแสดงให้เห็นว่าสูตรที่ fontification ประโยคใช้face
-property แทนfont-lock-face
-property
ต่อไปนี้เป็นข้อสันนิษฐานเนื่องจากฉันไม่เข้าใจอย่างสมบูรณ์เกี่ยวกับเครื่องจักรตัวล็อคแบบอักษรซึ่งค่อนข้างซับซ้อน
มันดูเหมือนว่าจะแข็งแกร่งกว่าface
font-lock-face
Rainbow-delimiters ใช้font-lock-face
ซึ่งถูกครอบงำด้วยface
การสร้างแบบอักษรวากยสัมพันธ์ อย่างไรก็ตามเรามีข้อได้เปรียบที่การทำให้แบบอักษรเป็นประโยคมาก่อนการค้นหาแบบอักษร (คำหลัก) ตามแบบอักษรซึ่งจะใช้ jit-lock (ดูหน้าข้อมูลของfont-lock-mode
)
นำไปสู่การที่ผมสรุปว่าปัญหาจะแก้ไขถ้าเราใช้face
ในการแทนrainbow-delimiters
font-lock-face
และที่นี่ฉันไม่รู้ผลลัพธ์ที่สมบูรณ์ แต่เนื่องจากrainbow-delimiters
ใช้jit-lock
โดยตรง (และไม่ผ่านfont-lock-mode
) เรากำลังยืนอยู่บนพื้นที่สั่นคลอนอยู่ดี
หมายเหตุที่ฉันมีอยู่แล้วติดต่อกับบางคนrainbow-delimiters
(ดู/programming/19800243/highlight-first-mismatching-paren/20022030#20022030 ) rainbow-blocks
แต่ไม่ได้มี เพราะฉันมีเพียงกรอบ จำกัด rainbow-delimiters
ของเวลาที่ฉันเลือกที่จะมีสมาธิในการ บางทีคุณสามารถแก้ปัญหาrainbow-blocks
-problem ในวิธีที่คล้ายกันได้