emacs 派生模式中 "special" 注释的不同字体锁定方案
different font-lock scheme for "special" comments in emacs derived-mode
我正在通过派生自 prog-mode 来定义 Emacs 主要模式。除了一件事外,字体锁定有效:
我想强调一种包含特殊链接器指令的特殊注释类型,使用与常规注释所用字体不同的字体。常规注释以“;”开头而链接器指令的格式为“;<...指令...>”。当然,字符串中的文本不应被误认为是注释。
我目前拥有的是:
;; define syntax highlighting
(setq p18-font-lock-defaults
`(
;; strings
("\"\.\*\?" . font-lock-string-face)
;; linker directives
("^ *;<.+>.*$" . font-lock-preprocessor-face)
;; mnemonics
( , p18-mnemonics-regexp . font-lock-keyword-face)
)
)
;; define derived mode
(define-derived-mode p18-mode prog-mode "P18"
"...mode description..."
;; define syntax highlighting
(set (make-local-variable 'font-lock-defaults)
'(p18-font-lock-defaults nil t))
;; comments
(setq comment-start ";")
(setq comment-end "")
;; === works when comments start with "; "
;; (modify-syntax-entry ?; ". 1" p18-mode-syntax-table)
;; (modify-syntax-entry 32 ". 2" p18-mode-syntax-table)
;; (modify-syntax-entry ?\n ">" p18-mode-syntax-table)
;; ugly incomplete hack works for comments with ASCII code of
;; second char ?\;
;; (modify-syntax-entry ?; ". 1" p18-mode-syntax-table)
;; (modify-syntax-entry '(?= . 127) ". 2" p18-mode-syntax-table)
;; (modify-syntax-entry ?\n ">" p18-mode-syntax-table)
)
问题在于,使用语法-table 条目,此机制将以 ; 开头的所有内容分类。作为评论。因此,链接器指令 regexp 不再有效。
我怎样才能达到预期的效果?看来我需要一种模式来检查后面的字符。但是随后使用语法 table 进行注释检测似乎不错,因为它可以正确处理字符串。
更一般地说,我对解释 emacs/elisp 的 "architecture" 的文档感兴趣(例如,模式以及字体锁定的操作顺序。缓冲区交互也是如此)。我有很棒的 elisp 参考手册,但我错过了对这些主题的概念介绍。我已经阅读了 emacs elisp 介绍,但不喜欢它,因为我也发现它 "tutorial-style",非常冗长和重复,并且缺少系统的覆盖范围。例如,没有关于反引号的句子。它似乎也适用于零编程经验的人——但是人们会从 elisp 开始吗?
你想用font-lock-syntactic-face-function
来区分哪一种评论得到哪张脸。例如。像
(defun my-font-lock-syntactic-face-function (ppss)
(if (and (nth 8 ppss)
(save-excursion
(goto-char (nth 8 ppss))
(looking-at ";<.+>")))
'font-lock-preprocessor-face
(funcall (default-value 'font-lock-syntactic-face-function) ppss)))
...
(define-derived-mode ...
...
(set (make-local-variable 'font-lock-syntactic-face-function)
#'my-font-lock-syntactic-face-function)
...
我正在通过派生自 prog-mode 来定义 Emacs 主要模式。除了一件事外,字体锁定有效:
我想强调一种包含特殊链接器指令的特殊注释类型,使用与常规注释所用字体不同的字体。常规注释以“;”开头而链接器指令的格式为“;<...指令...>”。当然,字符串中的文本不应被误认为是注释。
我目前拥有的是:
;; define syntax highlighting
(setq p18-font-lock-defaults
`(
;; strings
("\"\.\*\?" . font-lock-string-face)
;; linker directives
("^ *;<.+>.*$" . font-lock-preprocessor-face)
;; mnemonics
( , p18-mnemonics-regexp . font-lock-keyword-face)
)
)
;; define derived mode
(define-derived-mode p18-mode prog-mode "P18"
"...mode description..."
;; define syntax highlighting
(set (make-local-variable 'font-lock-defaults)
'(p18-font-lock-defaults nil t))
;; comments
(setq comment-start ";")
(setq comment-end "")
;; === works when comments start with "; "
;; (modify-syntax-entry ?; ". 1" p18-mode-syntax-table)
;; (modify-syntax-entry 32 ". 2" p18-mode-syntax-table)
;; (modify-syntax-entry ?\n ">" p18-mode-syntax-table)
;; ugly incomplete hack works for comments with ASCII code of
;; second char ?\;
;; (modify-syntax-entry ?; ". 1" p18-mode-syntax-table)
;; (modify-syntax-entry '(?= . 127) ". 2" p18-mode-syntax-table)
;; (modify-syntax-entry ?\n ">" p18-mode-syntax-table)
)
问题在于,使用语法-table 条目,此机制将以 ; 开头的所有内容分类。作为评论。因此,链接器指令 regexp 不再有效。
我怎样才能达到预期的效果?看来我需要一种模式来检查后面的字符。但是随后使用语法 table 进行注释检测似乎不错,因为它可以正确处理字符串。
更一般地说,我对解释 emacs/elisp 的 "architecture" 的文档感兴趣(例如,模式以及字体锁定的操作顺序。缓冲区交互也是如此)。我有很棒的 elisp 参考手册,但我错过了对这些主题的概念介绍。我已经阅读了 emacs elisp 介绍,但不喜欢它,因为我也发现它 "tutorial-style",非常冗长和重复,并且缺少系统的覆盖范围。例如,没有关于反引号的句子。它似乎也适用于零编程经验的人——但是人们会从 elisp 开始吗?
你想用font-lock-syntactic-face-function
来区分哪一种评论得到哪张脸。例如。像
(defun my-font-lock-syntactic-face-function (ppss)
(if (and (nth 8 ppss)
(save-excursion
(goto-char (nth 8 ppss))
(looking-at ";<.+>")))
'font-lock-preprocessor-face
(funcall (default-value 'font-lock-syntactic-face-function) ppss)))
...
(define-derived-mode ...
...
(set (make-local-variable 'font-lock-syntactic-face-function)
#'my-font-lock-syntactic-face-function)
...