font-lock-add-keywords tidak berfungsi
Jadi saya telah mencoba menambahkan penyorotan sintaks khusus untuk digit menggunakan font-lock-add-keywords
dan regex.
Saya telah melihat semua sumber daya Emacs untuk melakukan ini, dan meskipun saya berhasil mendefinisikan wajah, font-lock-add-keywords
belum 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 nil
di *Messages*
buffer.
Memperbarui
Saya mengikuti saran Gilles dan membuat mode minor, menyetel font-lock-add-keywords
ke 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-keywords
sepertinya 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
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)
font-lock-add-keywordsmenambahkan kata kunci untuk mode utama tertentu , seperti mode Lisp atau mode C atau mode HTML. Karena font-lock-mode
bukan 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 FACESPEC
untuk menjadi sebuah ekspresi yang nilainya menentukan wajah. custom-faces-highlight-numbers-face
tidak berfungsi karena ini bukan ekspresi yang valid karena simbolnya custom-faces-highlight-numbers-face
tidak 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)))