如何在无预配置的原生Emacs中禁用font-lock-warning-face
禁用font-lock-warning-face的Emacs配置方案
需求说明
- 使用原生无预配置/框架的Emacs
- 核心目标:在所有模式下禁用font-lock-warning-face,要求该face完全不被应用,而非修改其样式或设置为“不可见”
- 相关文本属性示例:
(face (font-lock-warning-face) help-echo "Easy to misread; consider moving the element to the next line" fontified t)
现有自定义Face配置
已定义以下自定义face,用于统一Lisp方言及通用元素的显示样式:
(defface punctuation-face '((t :inherit default)) "Parentheses, operators and others.") (defface lisp-dialect-fallback-face '((t :inherit default)) "For ones doesn't has a face in Lisp dialects.") (defface lisp-dialect-boolean-face '((t :inherit default)) "Lisp builtin values like nil or t.") (defface numeric-values-face '((t :inherit default)) "Face for numeric values.")
现有Font-Lock规则
Lisp方言模式专属规则
针对Emacs Lisp、Common Lisp、Scheme模式配置的关键字高亮规则:
(dolist (mode '(emacs-lisp-mode lisp-mode scheme-mode)) (font-lock-add-keywords mode `((\"\\<\\(nil\\|t\\)\\>\" 1 'lisp-dialect-boolean-face prepend) (\"\\([a-z][-a-z]*\\([0-9]+\\)?\\)\" 1 (unless (get-text-property (match-beginning 1) 'face) 'lisp-dialect-fallback-face) keep)) t))
全局通用规则
通过after-change-major-mode-hook实现的全模式数字、标点高亮规则:
(add-hook 'after-change-major-mode-hook (lambda () (font-lock-add-keywords nil `((\"\\(\\_<-?[0-9]+\\.?[0-9]*\\)\" 0 'numeric-values-face keep) (\"[][(){}\\+\\-/\\*=<>!&|$.;:~'?`#]\" 0 'punctuation-face keep)))))
修改方案:覆盖font-lock-warning-face
针对Lisp方言模式的修改
现有lisp-dialect-fallback-face仅在目标文本无face时触发,可修改其逻辑,当文本无face或当前face为font-lock-warning-face时应用该fallback face,以此覆盖警告face:
(dolist (mode '(emacs-lisp-mode lisp-mode scheme-mode)) (font-lock-add-keywords mode `((\"\\<\\(nil\\|t\\)\\>\" 1 'lisp-dialect-boolean-face prepend) (\"\\([a-z][-a-z]*\\([0-9]+\\)?\\)\" 1 (let ((current-face (get-text-property (match-beginning 1) 'face))) (unless (and current-face (not (equal current-face 'font-lock-warning-face))) 'lisp-dialect-fallback-face)) keep)) t))
全局全模式覆盖方案
若需要在所有模式下禁用font-lock-warning-face,可扩展全局规则,添加针对警告face的匹配替换:
(add-hook 'after-change-major-mode-hook (lambda () (font-lock-add-keywords nil `((\"\\(\\_<-?[0-9]+\\.?[0-9]*\\)\" 0 'numeric-values-face keep) (\"[][(){}\\+\\-/\\*=<>!&|$.;:~'?`#]\" 0 'punctuation-face keep) ;; 匹配所有应用了font-lock-warning-face的文本,替换为default face (any (get-text-property (match-beginning 0) 'face) (equal (get-text-property (match-beginning 0) 'face) 'font-lock-warning-face) 0 'default keep)))))
内容的提问来源于stack exchange,提问作者Bujakiewicz Franco
相关产品推荐
相关产品推荐

