0

我编写了以下代码以不同颜色突出显示 AUCTeX 缓冲区中的美元符号,但后来我发现它甚至在注释中突出显示美元符号,这是无意的,但我开始喜欢它。但现在只是出于好奇,我想知道这是否可以避免。

(defun my-LaTeX-mode-dollars ()
  (font-lock-add-keywords
   nil
   `((,(rx "$") (0 'success t)))
   t))
(add-hook 'LaTeX-mode-hook 'my-LaTeX-mode-dollars)
4

1 回答 1

1

从以下文档font-lock-keywords

MATCH-HIGHLIGHT 应采用以下形式:

(SUBEXP FACENAME [覆盖 [LAXMATCH]])

OVERRIDE 和 LAXMATCH 是标志。如果 OVERRIDE 为 t,则可以覆盖现有的字体。如果keep', only parts not already fontified are highlighted. Ifprepend' 或 'append',则现有字体与新字体合并,其中新字体或现有字体分别优先。

换句话说,如果你放弃tafter 'success,它将不再使注释和字符串中的美元符号字体化。

编辑:

显然,在这种情况下,上述解决方案是不够的,可能是因为之前美元符号已使用另一面着色。

一种可行的方法是不将 HOW 参数(当前t)传递给font-lock-add-keywords. 这意味着它们应该被添加到列表的末尾。但是,这可能会导致其他事情停止工作。

如果我们需要更大的锤子,您可以编写更高级的规则来检查当前的字体化,并决定对此做什么。例如,Emacs 使用以下内容在字符串中位于第 0 列的括号中添加警告面:

"^\\s("
  (0
   (if
       (memq
        (get-text-property
         (match-beginning 0)
         'face)
        '(font-lock-string-face font-lock-doc-face font-lock-comment-face))
           (list 'face font-lock-warning-face 'help-echo "Looks like a toplevel defun: escape the parenthesis"))
   prepend)

第三种方法是将正则表达式替换为可以(rx "$")搜索$并检查它是否出现在正确上下文中的函数名称。可以在标准 Emacs 包中找到此类字体锁定规则的一个示例cwarn

于 2013-12-13T20:48:33.650 回答