如何在Heredoc中启用特定于语言的语法?


19

当我编辑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语法突出显示规则。这些语法规则在哪里定义,如何添加到它们中?


1
注意:// This should be syntax-highlighted这不是有效的CSS注释,因此应将语法突出显示为注释以外的内容。CSS仅支持/* */多行注释。//仅当使用预处理器语言(例如Sass或Stylus)时,才支持单行注释。
罗里·奥肯

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

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

Answers:


3

TL; DR:

它在Vim的PHP和HTML语法文件中定义。要查看如何为CSS添加规则,请跳至“如何添加规则”部分下方,或继续阅读以了解其工作原理。

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

JavaScript Heredoc使用Vim的语法contains1功能突出显示,该功能允许语法组包含其他语法组。

要找到它的定义位置,请首先打开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*\)\)\2$"
\ end="^\z1\(;\=$\)\@="
\ contained
\ contains=@htmlJavascript,phpIdentifierSimply,phpIdentifier,phpIdentifierComplex,phpBackslashSequences,phpMethodsVar,@Spell
\ keepend extend

添加了行继续以方便阅读

好的,因此此语法区域查找带有复杂正则表达式的JavaScript Heredoc,并通过在参数中包含@htmlJavascript语法cluster2来允许JavaScript在该区域中突出显示contains

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

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

这很容易!

但是我们不希望在CSS Heredoc中突出显示JavaScript。因此,我们还需要将改为@htmlJavascriptCSS。但是,什么 CSS的相同呢?(您也许可以猜测,但是让我们确定一下动作。)

让我们搜索htmljavascript3以查看在哪里定义:

/htmljavascript

嗯 没有其他结果。必须在其他地方定义!让我们快速浏览文件的顶部,看看是否可以找到任何包含:

runtime! syntax/html.vim

看起来可能是4

:e $VIMRUNTIME/syntax/html.vim

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

syn cluster htmlJavaScript      add=@htmlPreproc

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

/htmlcss

对!

syn include @htmlCss syntax/css.vim

所以我们只需要在参数中替换@htmlJavascript为:@htmlCsscontains

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

以及我如何添加到他们?

将下面的整个语法命令保存在文件中,~/after/syntax/php.vim以便在其余的PHP语法处理完成后运行,您已完成!

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

1:查看:help :syn-contains详细信息。
2:请参阅:help :syn-cluster
3:我已经'ignorecase'开机了 如果没有它,您将需要搜索htmlJavascript\chtmljavascript
4:实际上,根据Vim语法文件中使用的命名方案,我们可能htmlJavascript仅根据名称就可以找到答案。
5:这次,“ JavaScript”的大小写不同。幸运的是我们已经'ignorecase'开机了,是吗?

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.