当我编辑PHP文件并在Heredoc中定义字符串时,如果它是JavaScript语法或HTML语法或SQL语法,则将在Heredoc内部启用语法突出显示。但是,它不适用于CSS语法。

示例(如果我们使用以下代码创建名为hello.php的新PHP文件):

 <?php
$foo = <<<"JAVASCRIPT"
var hello = "hello";
JAVASCRIPT;

$bar = <<<"CSS"
/* This code below should be syntax-highlighted. */
.hello {
  font-weight: bold;
}
CSS;
 


JAVASCRIPT块正确突出显示,但CSS块未突出显示。另外,如果我在JavaScript代码块上的SynStack关键字上运行var,则会得到['phpRegion', 'phpHereDoc', 'javaScriptIdentifier'],但是如果对CSS块中的任何位置进行相同的操作,则只会得到['phpRegion', 'phpHereDoc'],因此我需要添加一些CSS语法突出显示规则。这些语法规则在哪里定义,以及如何添加到它们?

评论

注意://应该以语法高亮显示,这不是有效的CSS注释,因此,语法应突出显示为注释以外的内容。 CSS仅支持/ * * /多行注释。 //仅当使用预处理器语言(例如Sass或Stylus)时,才支持单行注释。

你是对的。我已经更新了代码以反映该更改。

我也希望获得CSS Heredoc语法高亮的解决方案。我尝试了许多情况,但无法正常工作。有人有解决办法吗?

#1 楼

TL; DR:

在Vim的PHP和HTML语法文件中定义。要查看如何为CSS添加规则,请跳至“如何添加规则”部分。

这些语法规则在哪里定义?

JavaScript此处文档使用Vim的contains 1语法突出显示,该功能允许语法组包含其他语法组。

要找到定义的位置,请首先打开PHP的语法突出显示文件:

:e $VIMRUNTIME/syntax/php.vim


现在,假设语法文件正在基于字符串“ javascript”的匹配找到JavaScript heredoc,所以让我们尝试搜索该代码:

/javascript


第三个匹配项是这个评论吗?

" including HTML,JavaScript,SQL even if not enabled via options


看起来很有希望!让我们看一下相关的语法行:

syn region  phpHereDoc  matchgroup=Delimiter
\ start="\(<<<\)\@<=\(\"\=\)\z(\(\I\i*\)\=\(javascript\)\c\(\i*\)\)$"
\ end="^\z1\(;\=$\)\@="
\ contained
\ contains=@htmlJavascript,phpIdentifierSimply,phpIdentifier,phpIdentifierComplex,phpBackslashSequences,phpMethodsVar,@Spell
\ keepend extend


(添加了行延续以便于阅读)

好,因此此语法区域可以找到JavaScript heredoc具有复杂的正则表达式,并且可以通过在@htmlJavascript参数中包含cluster语法contains 2来在区域内突出显示JavaScript。

但是CSS heredocs没有相应的定义!让我们加一个。因此,首先要更改的是start正则表达式。只需将javascript更改为css即可:

start="\(<<<\)\@<=\(\"\=\)\z(\(\I\i*\)\=\(css\)\c\(\i*\)\)$"


这很容易!

但是我们不想在CSS heredoc中突出显示JavaScript。因此,我们还需要将@htmlJavascript更改为CSS等效项。但是什么是CSS等效项? (您也许可以猜测,但让我们确定一下动作。) />
嗯。没有其他结果。必须在其他地方定义!让我们快速浏览文件的顶部,看看是否可以找到任何包含文件的文件:

/htmljavascript


它看起来可能像是它4。 br />
runtime! syntax/html.vim


在此文件中再次运行搜索,我们找到以下行5:

:e $VIMRUNTIME/syntax/html.vim


因此htmlJavaScript是htmljavascript,在cluster中定义。我们可以使用类似的CSS集群吗?

syn cluster htmlJavaScript      add=@htmlPreproc


对!

/htmlcss


所以我们只是需要在html.vim参数中用@htmlJavascript替换@htmlCss

syn include @htmlCss syntax/css.vim


如何添加它们?

在下面保存整个语法命令在文件contains中运行,以便在其余的PHP语法处理完成之后运行它。完成后!

contains=@htmlCss,phpIdentifierSimply,phpIdentifier,[...]



1 :请参阅~/after/syntax/php.vim
2:请参阅:help :syn-contains
3:我已打开:help :syn-cluster。如果没有它,您将需要搜索'ignorecase'htmlJavascript
4:实际上,根据Vim语法文件中使用的命名方案,我们可能仅根据\chtmljavascript名称就可以弄清楚这一点。 > 5:这次,“ JavaScript”的大小写不同。幸运的是我们打开了htmlJavascript,是吗?