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