font-lock-add-keywordsが機能していません

Aug 18 2020

そのためfont-lock-add-keywords、正規表現を使用して数字を強調表示するカスタム構文を追加しようとしています。

私はこれを行うためにすべてのEmacsリソースを調べてきましたが、顔を正常に定義することはできましたfont-lock-add-keywordsが、明らかな理由で機能していません。

私はさまざまなソースから例をコピーし、それらを直接動作させようとしましたが、明らかな成功はありませんでした。コードの何が問題なのか理解できないようです。エラーは発生しませんが、font-lock-add-keywords(with C-x C-e)を評価しようとするnilと、*Messages*バッファーに出力されます。

更新

私はGillesのアドバイスを受けてマイナーモードを作成し、font-lock-add-keywordsそのカスタムマイナーモードに設定して、顔に引用符を使用しました。モード行にマイナーモードが表示され、動作していることがわかりますが、font-lock-add-keywordsそれでも動作していないようです。これが私の更新されたコードです:

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

私はWindows10でGNUEmacs 26.3(ビルド1、x86_64-w64-mingw32)を実行しています。どんな助けでも大歓迎です!ありがとうございました!

回答

2 Gyo Aug 19 2020 at 17:00

さらなる調査とGillesとLindydancerからのコメントの助けを借りて、マイナーモードにFontLockキーワードを追加できないことを発見しました。代わりに、マイナーモードがロードおよびアンロードされるときに、キーワードをメジャーモードに追加および削除する必要があります。

マイナーモードを使用してキーワードを強調表示する作業コードは次のとおりです。

(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-keywordsLispモード、Cモード、HTMLモードなど、特定のメジャーモードのキーワードを追加します。font-lock-modeはメジャーモードではないため(font-lock-add-keywords 'font-lock-mode …)、効果はありません。

すべてのメジャーモードに適用されるフォントロックキーワードが本当に必要な場合は、マイナーモードを定義する必要があります。これがホワイトスペースモードの仕組みです。ホワイトスペースモードの多くは、必要なものよりも複雑です。ホワイトスペースモードに「数字のハイライト」設定を追加することもできますが、独自のモードを定義する方が簡単な場合があります。便利な機能がdefine-minor-mode役立ちますが、モードが呼び出すことによって、オンまたはオフにしたとき、あなたはまだ手動キーワードを追加したり削除する必要があります(font-lock-add-keywords nil …)(font-lock-remove-keywords nil …)。マイナーモードでハイライトを追加できますか?を参照してください。手順については。

さらに、顔のしくみには落とし穴があります。顔の名前は変数ではない記号です。の(MATCHER . FACESPEC)形式は、値が面を指定する式であるfont-lock-keywords必要FACESPECがあります。custom-faces-highlight-numbers-faceシンボルcustom-faces-highlight-numbers-faceがバインドされていないため、有効な式ではないため、機能しません。これには2つの解決策があります。従来の解決策は、顔と同じ名前の変数を定義することです。フォントロックモードで定義されている面では、このように機能しますが、

新しいコードでは、ほとんどの場合、顔の名前を指定する変数を作成する必要がないことに注意してください。顔を直接使うだけで十分です。フォントロックは、この領域で従うべきテンプレートではありません。

推奨されるが面倒な解決策は、記号を引用することです。

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