Emacs 如何在AUCTeX缓冲区中仅在注释外部锁定美元符号(数学模式分隔符)?

Emacs 如何在AUCTeX缓冲区中仅在注释外部锁定美元符号(数学模式分隔符)?,emacs,elisp,auctex,font-lock,Emacs,Elisp,Auctex,Font Lock,我编写了以下代码以不同颜色突出显示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) 从字体

我编写了以下代码以不同颜色突出显示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)

字体锁定关键字的文档中

匹配突出显示应采用以下形式:

(SUBEXP FACENAME[覆盖[LAXMATCH]])

覆盖和匹配是标志。如果OVERRIDE为t,则表示存在 字体化可以被覆盖。如果
keep',则仅限尚未安装的零件
字体被突出显示。如果
prepend'或'append',则存在 字体化与新字体合并,其中新字体或现有字体 字体化分别优先

换句话说,如果在“成功”之后删除
t
,它将不再在注释和字符串中设置美元符号

编辑:

显然,在这种情况下,上述解决方案是不够的,可能是因为美元符号早些时候已经用另一张脸着色了

一种可能有效的方法是不将HOW参数(当前为
t
)传递给
字体锁定添加关键字。这意味着它们应该被添加到列表的末尾。然而,这可能会导致其他事情停止工作

如果我们需要一个更大的锤子,您可以编写一个更高级的规则来检查当前的字体,并决定如何处理它。例如,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)

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

中找到,它也不再将成功字体应用于注释之外的美元符号