示例(如果我们使用以下代码创建名为
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 楼
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
,是吗?
评论
注意://应该以语法高亮显示,这不是有效的CSS注释,因此,语法应突出显示为注释以外的内容。 CSS仅支持/ * * /多行注释。 //仅当使用预处理器语言(例如Sass或Stylus)时,才支持单行注释。你是对的。我已经更新了代码以反映该更改。
我也希望获得CSS Heredoc语法高亮的解决方案。我尝试了许多情况,但无法正常工作。有人有解决办法吗?