Làm cách nào để chỉ định một khuôn mặt tùy chỉnh với mặc định phông chữ?


11

Nếu tôi xác định từ khóa khóa phông chữ bằng các khuôn mặt hiện có, tôi có thể đánh dấu chuỗi '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)))

Điều này nổi bật chính xác:

foo đánh dấu chính xác

Tuy nhiên, nếu tôi xác định khuôn mặt của chính mình:

(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)))

Không làm nổi bật được áp dụng:

không làm nổi bật

Làm thế nào tôi có thể sử dụng font-lock-defaultsvới khuôn mặt tôi đã xác định chính mình?

Câu trả lời:


8

Hãy xem C-hvgiá trị của font-lock-type-facegiá trị chỉ là biểu tượng font-lock-type-face. Bây giờ hãy nhìn vào C-hvgiá trị của my-mode-foo-face. Ôi không! bạn không thể Đó không phải là một biến số!

Bạn cần một biến để truy cập vào khuôn mặt của bạn. Khai báo foo-facemặt không khai báo foo-facebiến.

Thêm (defvar my-mode-foo-face 'my-mode-foo-face)sau định nghĩa khuôn mặt và sau đó khóa phông chữ có thể sử dụng my-mode-foo-facevar của bạn để truy cập vào my-mode-foo-facekhuôn mặt. Bối rối tôi biết.


Chỉnh sửa: dường như có một giải pháp tốt hơn dựa trên những gì font-lock.el nói:

;; 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.

Đó có thể là giải pháp của Wilfred khi trích dẫn hai mặt trong các từ khóa.


3
Aha, vì vậy nó đang mong đợi một biến. (cons "foo" ''my-mode-foo-face))cũng hoạt động, nhưng tôi không chắc đó là thành ngữ.
Wilfred Hughes

1
Hmm, câu trả lời của tôi dường như là giải pháp lỗi thời cho vấn đề dựa trên những gì tôi đang đọcfont-lock.el
Jordon Biondo

3
Đó là mong đợi một biểu thức, thực sự, nó sẽ đánh giá. Vì vậy, bạn cũng có thể đặt một số logic trong đó.
Dmitry
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.