ฉันจะระบุใบหน้าที่กำหนดเองด้วย font-lock-defaults ได้อย่างไร


11

หากฉันกำหนดคีย์เวิร์ดให้ล็อคแบบอักษรโดยใช้ใบหน้าที่มีอยู่ฉันสามารถไฮไลต์สตริง 'foo'

(defconst my-mode-font-lock-keywords
  (list
   (cons "foo" 'font-lock-type-face)))

(define-derived-mode my-mode fundamental-mode "My mode"
  "A demo mode."
  (set (make-local-variable 'font-lock-defaults) '(my-mode-font-lock-keywords)))

ไฮไลท์นี้ถูกต้อง:

ไฮไลต์ foo อย่างถูกต้อง

อย่างไรก็ตามถ้าฉันกำหนดใบหน้าของตัวเอง:

(defface my-mode-foo-face
  '((t :inherit font-lock-preprocessor-face))
  "Face for highlighting 'foo'.")

(defconst my-mode-font-lock-keywords
  (list
   (cons "foo" 'my-mode-foo-face)))

(define-derived-mode my-mode fundamental-mode "My mode"
  "A demo mode."
  (set (make-local-variable 'font-lock-defaults) '(my-mode-font-lock-keywords)))

ไม่มีการนำไฮไลต์ไปใช้:

ไม่มีการเน้น

ฉันจะใช้font-lock-defaultsกับใบหน้าที่ฉันกำหนดเองได้อย่างไร

คำตอบ:


8

ลองดูที่มีC-hvค่าของค่าเป็นเพียงสัญลักษณ์font-lock-type-face font-lock-type-faceตอนนี้ดูที่ค่าของC-hv my-mode-foo-faceไม่นะ! คุณทำไม่ได้! มันไม่ใช่ตัวแปร!

คุณต้องมีตัวแปรในการเข้าถึงใบหน้าของคุณ การประกาศfoo-faceใบหน้าไม่ได้ประกาศfoo-faceตัวแปร

เพิ่ม(defvar my-mode-foo-face 'my-mode-foo-face)หลังจากคำจำกัดความใบหน้าและจากนั้นแบบอักษรล็อคสามารถใช้my-mode-foo-facevar ของคุณเพื่อเข้าถึงmy-mode-foo-faceใบหน้า ฉันรู้ว่าสับสน


แก้ไข: ดูเหมือนว่าจะเป็นทางออกที่ดีขึ้นตามสิ่งที่ font-lock.el พูดว่า:

;; Originally these variable values were face names such as `bold' etc.
;; Now we create our own faces, but we keep these variables for compatibility
;; and they give users another mechanism for changing face appearance.
;; We now allow a FACENAME in `font-lock-keywords' to be any expression that
;; returns a face.  So the easiest thing is to continue using these variables,
;; rather than sometimes evalling FACENAME and sometimes not.  sm.

;; Note that in new code, in the vast majority of cases there is no
;; need to create variables that specify face names.  Simply using
;; faces directly is enough.  Font-lock is not a template to be
;; followed in this area.

นั่นอาจเป็นคำตอบของวิลเฟรดในการระบุใบหน้าเป็นสองเท่าในคำหลัก


3
อ้าดังนั้นจึงคาดหวังว่าตัวแปร (cons "foo" ''my-mode-foo-face))ใช้งานได้ แต่ฉันไม่แน่ใจว่ามันเป็นสำนวนไหน
Wilfred Hughes

1
อืมคำตอบของฉันดูเหมือนจะเป็นทางออกที่ล้าสมัยสำหรับปัญหาตามสิ่งที่ฉันกำลังอ่านอยู่font-lock.el
Jordon Biondo

3
มันคาดหวังถึงการแสดงออกซึ่งจริงๆแล้วมันจะประเมิน ดังนั้นคุณสามารถใส่ตรรกะลงไปได้
Dmitry
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.