【问题标题】:Conflict between font-lock and string literal coloring in EmacsEmacs 中字体锁定和字符串文字着色之间的冲突
【发布时间】:2013-09-10 19:10:54
【问题描述】:

在 Emacs 中,我正在编写一个混合 PHP 和非 PHP 代码的 PHP 文件,该文件将处于 C++ 模式。我希望 PHP 代码以链接粉红色背景突出显示,以使其在视觉上脱颖而出。

为此,我使用了字体锁定设置:

(make-face 'font-lock-special-macro-face)
(set-face-background 'font-lock-special-macro-face "pink")
(defun add-custom-keyw()
  "adds a few special keywords for c and c++ modes"
  ;
  (font-lock-add-keywords nil
   '(
     ("<\\?[^\\?]*\\?>" . 'font-lock-special-macro-face )
     ; more of those would go here
    )
  )
)
(setq font-lock-multiline t)
(add-hook 'c++-mode-hook 'add-custom-keyw)

正则表达式匹配典型的 PHP 标记及其包含的文本。但是,如果 PHP 块的主体中​​有任何字符串文字,则突出显示将失败。我认为这是因为上面定义的面与字符串文字的颜色冲突,默认情况下是彩色文本。

我应该怎么做才能解决这个问题?如果可能,我想保留两种着色方案(突出显示和彩色字符串文字)。

这是一个例子:

代码&lt;?= $className ?&gt; 以粉红色背景突出显示。

代码&lt;?= inputs_to_vector($factors, 'factors') ?&gt; 没有突出显示的背景,字符串文字'factors' 以红色文本显示。

无论使用前导 PHP 标记 &lt;? 还是 &lt;?=,都会发生这种情况。

【问题讨论】:

  • 请发布一个示例文字字符串并说明它是否正在接收高亮显示,如果是,它默认是什么脸。
  • 好的,我已经编辑了问题以包含一个示例。
  • 您是否考虑过修改您的regexp 以将' 视为add-custom-keyw 中列出的正则表达式的潜在结尾和潜在开始,并排除单引号内的任何内容——例如,排除类似这样的内容:"\\('\\)\\(\\(.\\|\n\\)+?\\)\\('\\)" 用于字符串文字的面是:font-lock-string-face

标签: php regex emacs font-lock text-coloring


【解决方案1】:

试试这个代替你的性别:

 '("<\\?[^\\?]*\\?>" 0 font-lock-special-macro-face t)
                                                    ^

最后一部分,t 表示此突出显示应该覆盖相同文本的任何现有突出显示。

【讨论】:

  • 我不知道为什么,但如果我们使用'("&lt;\\?[^\\?]*\\?&gt;" 0 font-lock-special-macro-face t)font-lock-keyword-face 最终会被用来突出显示&lt;?= $className ?&gt;。我使用了一个空白的 .emacs 文件在 c++.mode 中运行测试,只有问题中提出的代码被这个草稿答案修改。
  • 我并没有真正尝试更改正则表达式 --- 我假设它是正确的,问题是两个字体锁定规则应用于相同的文本,@JonClaus 需要这个规则覆盖另一个。但是如果不仔细看,您可以做的一件事是删除[...] 内的反斜杠:? 字符在[...] 内并不特殊,而且[...] 内无论如何也没有转义。如果那里有反斜杠,那么您也不打算匹配反斜杠。不知道这是否是这里想要的。
  • 所以font-lock-keyword-face 也必须匹配&lt;?= $className ?&gt;。覆盖指示符应该注意,如果两个规则匹配,PROVIDED这个新规则出现在规则列表中它打算覆盖的另一个规则之后。 IOW,必须附加:使用t 作为font-lock-add-keywords 的第三个参数。
  • 问题中的代码有问题:以下代码与 Drew 的答案一样,正如 Drew 所描述的那样:(defvar font-lock-special-macro-face (make-face 'font-lock-special-macro-face)) (set-face-background 'font-lock-special-macro-face "pink") (font-lock-add-keywords 'c++-mode '(("&lt;\\?[^\\?]*\\?&gt;" 0 font-lock-special-macro-face t)) 'prepend) 但是,@JonClaus 实际上希望两全其美——即,保留使用font-lock-string-face 突出显示字符串文字,并且在其他地方也有他自己的粉红色突出显示。
  • 问题中的代码缺少(defvar font-lock-special-macro-face . . .),也缺少'prepend)。我第一次测试失败的另一个原因是答案中的单引号需要在另一对左/右括号之外——例如,'((. . .))
猜你喜欢
  • 2012-12-12
  • 1970-01-01
  • 1970-01-01
  • 2021-10-24
  • 2011-04-20
  • 1970-01-01
  • 1970-01-01
  • 2019-04-04
  • 2015-02-03
相关资源
最近更新 更多