font-lock-add-keywords tidak berfungsi

Aug 18 2020

Jadi saya telah mencoba menambahkan penyorotan sintaks khusus untuk digit menggunakan font-lock-add-keywordsdan regex.

Saya telah melihat semua sumber daya Emacs untuk melakukan ini, dan meskipun saya berhasil mendefinisikan wajah, font-lock-add-keywordsbelum bekerja karena alasan yang jelas.

Saya bahkan menyalin contoh-contoh dari sumber yang berbeda dan secara langsung mencoba membuatnya bekerja tanpa hasil yang jelas. Saya tidak bisa menemukan apa yang salah dengan kode saya. Saya tidak menerima kesalahan apa pun, tetapi ketika saya mencoba untuk mengevaluasi font-lock-add-keywords(dengan C-x C-e), itu dicetak nildi *Messages*buffer.

Memperbarui

Saya mengikuti saran Gilles dan membuat mode minor, menyetel font-lock-add-keywordske mode minor kustom, dan menggunakan kutipan untuk wajah. Meskipun saya dapat melihat mode minor di baris mode dan mengetahui bahwa itu berfungsi, font-lock-add-keywordssepertinya masih tidak berfungsi. Ini kode saya yang diperbarui:

(defgroup gio-group nil
  "Group for customization"
  :prefix "gio-")

(defface gio-highlight-numbers-face
  '((t :inherit (default)
       :foreground "#ffff00"))
  "Face for numbers"
  :group 'gio-group )

(define-minor-mode gio-minor-mode
  "Minor mode for customizaion"
  :init-value t
  :lighter " GioMode"
  :global t
  :group 'gio-group)

(font-lock-add-keywords 'gio-minor-mode '(("[0-9]+" . 'gio-highlight-numbers-face)))

Saya menjalankan GNU Emacs 26.3 (build 1, x86_64-w64-mingw32) di Windows 10. Bantuan apa pun sangat kami hargai! Terima kasih!

Jawaban

2 Gyo Aug 19 2020 at 17:00

Dengan penelitian lebih lanjut dan beberapa bantuan dari komentar dari Gilles dan Lindydancer, saya menemukan bahwa Anda tidak dapat menambahkan kata kunci Font Lock ke mode minor. Sebagai gantinya, Anda harus menambah dan menghapus kata kunci ke mode utama saat mode minor dimuat dan dibongkar.

Berikut adalah kode kerja yang menyoroti kata kunci menggunakan mode minor:

(defgroup gio-group nil
  "Group for customization"
  :prefix "gio-")

(defface gio-highlight-numbers-face
  '((t :inherit (default)
       :foreground "#ffff00"))
  "Face for numbers"
  :group 'gio-group )

(defvar gio-keywords '(("\\(\\b\\|[-]\\)\\([-]?\\([0-9]+\\)\\(\\.?[0-9]\\)*\\)\\b" . 'gio-highlight-numbers-face)) ;; Integers & Decimals
  "Keywords for gio-minor-mode highlighting")

(define-minor-mode gio-minor-mode
  "Minor mode for customization"
  :init-value 1
  :lighter " GioMode"
  :group 'gio-group
  (when (bound-and-true-p gio-minor-mode)
    (font-lock-add-keywords nil gio-keywords)
    (font-lock-fontify-buffer))
  (when (not (bound-and-true-p gio-minor-mode))
    (font-lock-remove-keywords nil gio-keywords)
    (font-lock-fontify-buffer)))

(define-globalized-minor-mode gio-global-minor-mode gio-minor-mode gio-minor-mode :group 'gio-group)
(gio-global-minor-mode 1)
Gilles'SO-stopbeingevil' Aug 19 2020 at 05:18

font-lock-add-keywordsmenambahkan kata kunci untuk mode utama tertentu , seperti mode Lisp atau mode C atau mode HTML. Karena font-lock-modebukan mode utama (font-lock-add-keywords 'font-lock-mode …)tidak pernah berpengaruh apapun.

Jika Anda benar-benar menginginkan kata kunci kunci font yang berlaku di setiap mode utama, Anda perlu menentukan mode minor. Begitulah cara kerja mode Whitespace . Banyak mode Whitespace lebih rumit dari yang Anda butuhkan. Anda mungkin bisa menambahkan pengaturan "digit highlight" ke mode spasi, tetapi mungkin lebih mudah untuk menentukan mode Anda sendiri. Fungsi kemudahan define-minor-modemembantu, tetapi Anda masih perlu menambahkan dan menghapus kata kunci secara manual saat mode dihidupkan atau dimatikan, dengan memanggil (font-lock-add-keywords nil …)dan (font-lock-remove-keywords nil …). Lihat Bisakah saya menambahkan sorotan dalam mode minor? untuk instruksi.

Selain itu, ada masalah dalam cara kerja wajah: nama wajah adalah simbol yang bukan variabel. The (MATCHER . FACESPEC)bentuk font-lock-keywordsmembutuhkan FACESPECuntuk menjadi sebuah ekspresi yang nilainya menentukan wajah. custom-faces-highlight-numbers-facetidak berfungsi karena ini bukan ekspresi yang valid karena simbolnya custom-faces-highlight-numbers-facetidak terikat. Ada dua solusi untuk ini. Solusi tradisionalnya adalah dengan mendefinisikan variabel dengan nama yang sama seperti wajah; begitulah cara kerjanya untuk wajah yang didefinisikan oleh mode Font Lock, tetapi

Perhatikan bahwa dalam kode baru, dalam sebagian besar kasus, tidak perlu membuat variabel yang menentukan nama wajah. Cukup menggunakan wajah secara langsung sudah cukup. Font-lock bukan template yang harus diikuti di area ini.

Solusi yang direkomendasikan tetapi tidak praktis adalah dengan mengutip simbol tersebut.

(font-lock-add-keywords 'gyo-highlight-numbers-mode '(("[0-9]+" . 'custom-faces-highlight-numbers-face)))