4

在我的font-lock-defaults我有:

("\\(^\\| \\|\t\\)\\(![^\n]+\\)\n" 2 'factor-font-lock-comment)

评论字符是!,这使得评论得到正确的面孔。这很有效,除非评论中有一个竞争的字体锁定实体,比如一个字符串(用双引号分隔):

! this line is font-locked fine
! this one is "not" because "strings"

您如何让 font-lock 了解评论已经被字体锁定,并且不需要尝试对其中的任何字符串进行字体锁定?显而易见的方法是!在语法表中添加注释起始类:

(modify-syntax-entry ?! "< 2b" table)

此解决方案是不可能的,因为函数名称和其他包含的符号!是合法的,例如map! filter!foo!bar。添加!会导致包含此类名称的代码被错误地突出显示。

4

1 回答 1

4

通常,使用 font-lock 关键字突出显示评论是一个坏主意。最好使用句法阶段。

即使语法表不足以描述您的语言的语法,仍然可以在语法字体锁定阶段使用突出显示注释。解决方案是提供一个自定义函数来为!应该开始评论的字符分配句法属性。这是使用变量完成的syntax-propertize-function

有关详细信息,请参阅elisp 手册。此外,本教程非常详细地介绍了这一点。

更新:以下是定义!为注释开始字符的简单示例,但不在标识符内。一个现实世界的例子可能需要一种更精细的方法来检查某物是否是标识符。

(defun exmark-syntax-propertize (start end)
  (funcall (syntax-propertize-rules
            ("[[:alnum:]_]\\(!\\)"
             (1 "_")))
           start
           end))

(defvar exmark-mode-syntax-table
  (let ((table (make-syntax-table)))
    (modify-syntax-entry ?\n ">   " table)
    (modify-syntax-entry ?!  "<   " table)
    table))

(define-derived-mode exmark-mode prog-mode "!-Mark"
  "Major mode for !-mark."
  (set (make-local-variable 'syntax-propertize-function)
       'exmark-syntax-propertize))
于 2015-04-30T20:54:58.530 回答