Emacs Auctex 自定义语法高亮
Posted
技术标签:
【中文标题】Emacs Auctex 自定义语法高亮【英文标题】:Emacs Auctex custom syntax highlight 【发布时间】:2012-08-07 11:26:15 【问题描述】:我想强调一下我在 LaTeX 中创建的一个新命令:
\newcommand\conceito[3]
\subsection#1 (Original: \textit#2 #3).
我是这样使用这段代码的:
\conceitoFooBarBla
我跟着manual,把这段代码放到了我的~/.emacs
,但是没用:
(add-hook 'LaTeX-mode-hook
(lambda ()
(font-lock-add-keywords nil
'((""\\<\\(\\conceito)\\>"" 1 font-lock-warning-face t)))))
怎么了?
【问题讨论】:
【参考方案1】:编辑:Deokhwan Kim 最初指出您的正则表达式包含两个连续的双引号,并且右括号 )
也需要用双引号进行转义:
(add-hook 'LaTeX-mode-hook
(lambda ()
(font-lock-add-keywords nil
'(("\\<\\(\\conceito\\)\\>" 1 font-lock-warning-face t)))))
除了Deokhwan Kim指出的几点,还有以下两个问题:
'conceito' 前面需要四个反斜杠而不是两个:\\\\conceito
反斜杠序列 \\<
仅匹配单词开头的空字符串,但是,新 LaTeX 命令开头的反斜杠不被视为单词的一部分,因此 \\<
不会匹配。
试试这个:
(add-hook 'LaTeX-mode-hook
(lambda ()
(font-lock-add-keywords nil
'(("\\(\\\\conceito\\)\\>" 1 font-lock-warning-face t)))
编辑:Deokhwan Kim 所做的另一个很好的观察是,在这种特殊情况下,您根本不需要括号,因为无论如何您都在尝试匹配整个表达式。所以最后一行的替代方案可能是:
'(("\\\\conceito\\>" 0 font-lock-warning-face t)))))
关于括号的观点是正确的,但是您实际上可以扩展您的正则表达式以仅在左大括号 跟随单词“conceito”时匹配。但是由于您真的不想突出显示那个大括号,因此使用括号定义的子组是可行的方法:
(add-hook 'LaTeX-mode-hook
(lambda ()
(font-lock-add-keywords nil
'(("\\(\\\\conceito\\)\\s-*" 1 font-lock-warning-face t)))
请注意,由于我们正在测试紧跟在“conceito”之后的(除非中间有空格),因此我们根本不需要测试
\\>
。
一般来说,尝试 M-x re-builder 以交互方式制作正则表达式:您可以在一个小缓冲区中编辑一个新的正则表达式,并立即查看您调用 re-建设者。
【讨论】:
为了记录,在我删除的帖子中,我指出了问题中的正则表达式中的一些错误,例如连续双引号""
和)
之前缺少\\。但托马斯通知我,其他问题仍然潜伏在那里,我的解决方案还不够。所以我删除了我的帖子以避免任何并发症。
干得好!还有一个建议是,在最后一个示例中,\\s-*
最好不要在那里。在 LaTeX 中,一个参数应该紧跟在它的宏后面,它们之间没有任何空格,不是吗?
@Deokhwan Kim - 不,命令和
之间的空格很好。
糟糕。到目前为止我一直误解它。再次感谢!【参考方案2】:
GNU AUCTeX 具有为用户定义的宏定义自定义突出显示的内置方式。查看变量font-latex-user-keyword-classes
和AUCTeX documentation。
这是一个简单的例子(我的配置):
(setq font-latex-user-keyword-classes
'(("shadow-hidden" (("hide" "")) shadow command)
("shadow-mycomment" (("mycomment" "")) shadow command)
("shadow-comment" (("comment" "")) shadow command)))
这将在暗淡的阴影面上显示 \hide、\mycomment 和 \comment 宏的内容。
【讨论】:
以上是关于Emacs Auctex 自定义语法高亮的主要内容,如果未能解决你的问题,请参考以下文章