【问题标题】:different font-lock scheme for "special" comments in emacs derived-modeemacs派生模式中“特殊”注释的不同字体锁定方案
【发布时间】:2016-06-28 16:53:38
【问题描述】:

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

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

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

;; 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 开始吗?

【问题讨论】:

    标签: emacs comments elisp font-lock major-mode


    【解决方案1】:

    你想用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)
      ...
    

    【讨论】:

    • 除了调用默认的 font-lock-syntactic-face-function 外,该方案有效。我不得不将symbol-default 更改为default-value。没有抱怨,只是想检查一下我是否做对了。
    • @user52366:呃,你说得对,我的意思是default-value(出于某种原因,我经常犯这个错误)。我相应地修复了代码。
    • 好问题。很好的答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-08-11
    • 1970-01-01
    • 1970-01-01
    • 2012-12-25
    • 1970-01-01
    • 2011-09-09
    • 1970-01-01
    相关资源
    最近更新 更多