在我的font-lock-defaults
中,我有:
("\(^\| \|t\)\(![^n]+\)n" 2 'factor-font-lock-comment)
评论字符是!
的,这使得评论得到正确的面孔。这主要有效,除非注释中存在竞争的字体锁定实体,例如字符串(由双引号分隔):
! this line is font-locked fine
! this one is "not" because "strings"
您如何获得字体锁定以了解注释已经很好地锁定了字体,并且不需要尝试在其中对任何字符串进行字体锁定?显而易见的方法是将!
添加到语法表中的注释起始类中:
(modify-syntax-entry ?! "< 2b" table)
此解决方案是不可能的,因为函数名称和其他包含!
的符号是合法的,例如 map!
filter!
和 foo!bar
。添加!
会导致包含此类名称的代码无法正确突出显示。
通常,使用字体锁定关键字突出显示注释是一个坏主意。为此最好使用句法阶段。
即使语法表不够强大,无法描述语言的语法,仍然可以突出显示在语法字体锁定阶段使用的注释。解决方案是提供一个自定义函数,将语法属性分配给应开始注释的!
字符。这是使用变量 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))