1

我通过从 prog-mode 派生来定义 Emacs 主要模式。字体锁定工作除了一件事:

我想强调一种特殊的注释类型,它包含特殊的链接器指令,使用与常规注释不同的字体。常规注释以“;”开头 而链接器指令的格式为“;<...directive...>”。当然,字符串中的文本不应被误认为是注释。

到目前为止,我所拥有的是:

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

  )

问题在于,使用语法表条目,此机制将对所有以 ; 开头的内容进行分类。作为评论。因此,链接器指令正则表达式不再有效。

我怎样才能实现所需的行为?看来我需要一种允许检查后面的字符的模式。但是使用语法表进行评论检测看起来不错,因为它可以正确处理字符串。

更一般地说,我对解释 emacs/elisp 的“架构”的文档感兴趣(例如,模式和哪些操作序列适用于字体锁定。缓冲区交互也是如此)。我有很棒的 elisp 参考手册,但我错过了对这些主题的概念介绍。我已经阅读了 emacs elisp 介绍,但不喜欢它,因为我发现它太“教程式”,非常冗长和重复,并且缺少系统的覆盖。例如,没有关于反引号的句子。它似乎也适用于编程经验为零的人 - 但是会从 elisp 开始吗?

4

1 回答 1

2

你想用什么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)
  ...
于 2016-03-14T12:47:45.537 回答