TL; DR:
它在Vim的PHP和HTML语法文件中定义。要查看如何为CSS添加规则,请跳至“如何添加规则”部分。下方,或继续阅读以了解其工作原理。
这些语法规则在哪里定义?
JavaScript Heredoc使用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*\)\)\2$"
\ end="^\z1\(;\=$\)\@="
\ contained
\ contains=@htmlJavascript,phpIdentifierSimply,phpIdentifier,phpIdentifierComplex,phpBackslashSequences,phpMethodsVar,@Spell
\ keepend extend
(添加了行继续以方便阅读)
好的,因此此语法区域查找带有复杂正则表达式的JavaScript Heredoc,并通过在参数中包含@htmlJavascript
语法cluster
2来允许JavaScript在该区域中突出显示contains
。
但是CSS heredocs没有相应的定义!让我们加一个。因此,首先要更改的是start
正则表达式。只需将更javascript
改为css
:
start="\(<<<\)\@<=\(\"\=\)\z(\(\I\i*\)\=\(css\)\c\(\i*\)\)\2$"
这很容易!
但是我们不希望在CSS Heredoc中突出显示JavaScript。因此,我们还需要将改为@htmlJavascript
CSS。但是,什么是 CSS的相同呢?(您也许可以猜测,但是让我们确定一下动作。)
让我们搜索htmljavascript
3以查看在哪里定义:
/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
为:@htmlCss
contains
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'
开机了,是吗?
// This should be syntax-highlighted
这不是有效的CSS注释,因此应将语法突出显示为注释以外的内容。CSS仅支持/* */
多行注释。//
仅当使用预处理器语言(例如Sass或Stylus)时,才支持单行注释。