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

Windows 10에서 GNU Emacs 26.3 (빌드 1, x86_64-w64-mingw32)을 실행하고 있습니다. 도움을 주시면 감사하겠습니다! 감사합니다!

답변

2 Gyo Aug 19 2020 at 17:00

Gilles와 Lindydancer의 추가 조사와 의견의 도움으로 부 모드에 글꼴 잠금 키워드를 추가 할 수 없다는 것을 발견했습니다. 대신 부 모드가로드 및 언로드 될 때 주 모드에 키워드를 추가하고 제거해야합니다.

다음은 부 모드를 사용하여 키워드를 강조하는 작업 코드입니다.

(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가 바인딩 되지 않았기 때문에 유효한 표현식이 아니기 때문에 작동하지 않습니다 . 이에 대한 두 가지 해결책이 있습니다. 전통적인 해결책은 얼굴과 같은 이름으로 변수를 정의하는 것입니다. 그것이 글꼴 잠금 모드가 정의하는 얼굴에 대해 작동하는 방식이지만

새 코드에서는 대부분의 경우 얼굴 이름을 지정하는 변수를 만들 필요가 없습니다. 얼굴을 직접 사용하는 것만으로도 충분합니다. 글꼴 잠금은이 영역에서 따라야 할 템플릿이 아닙니다.

권장되지만 번거로운 해결책은 기호를 인용하는 것입니다.

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