TL; DR:
É definido nos arquivos de sintaxe PHP e HTML do Vim. Para ver como adicionar regras para CSS, vá para a seção E como adiciono a elas? abaixo ou continue lendo para obter uma explicação de como funciona.
Onde essas regras de sintaxe estão sendo definidas?
O heredoc JavaScript é destacado usando o recurso de sintaxe contains1 do Vim , que permite que grupos de sintaxe contenham outros grupos de sintaxe.
Para descobrir onde isso está definido, primeiro abra o arquivo de destaque de sintaxe para PHP:
:e $VIMRUNTIME/syntax/php.vim
Agora, presumivelmente, o arquivo de sintaxe está localizando o heredoc do JavaScript com base em uma correspondência da string "javascript", então vamos tentar procurar por isso:
/javascript
A terceira partida é este comentário:
" including HTML,JavaScript,SQL even if not enabled via options
Parece promissor! Vamos dar uma olhada na linha de sintaxe relevante:
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
( continuações de linha adicionadas para facilitar a leitura )
Ok, essa região de sintaxe localiza o heredoc do JavaScript com uma expressão regular complicada e permite o realce do JavaScript na região, incluindo a @htmlJavascriptsintaxe cluster2 no containsargumento.
Mas não existe uma definição correspondente para heredocs CSS! Vamos adicionar um. Portanto, a primeira coisa a mudar é a startexpressão regular. Simplesmente mude javascriptpara css:
start="\(<<<\)\@<=\(\"\=\)\z(\(\I\i*\)\=\(css\)\c\(\i*\)\)\2$"
Isso é facil!
Mas não queremos destacar o JavaScript em nosso CSS heredoc. Então, também precisamos alterar o @htmlJavascriptpara o equivalente em CSS. Mas qual é o equivalente em CSS? (Você pode adivinhar, mas vamos fazer os movimentos para ter certeza.)
Vamos procurar htmljavascript3 para ver onde está definido:
/htmljavascript
Hummm. Nenhum outro resultado. Deve ser definido em outro lugar! Vamos dar uma rápida olhada na parte superior do arquivo para ver se podemos encontrar algum inclui:
runtime! syntax/html.vim
Parece que pode ser isso 4 .
:e $VIMRUNTIME/syntax/html.vim
Execute a pesquisa novamente neste arquivo e encontramos a linha 5 :
syn cluster htmlJavaScript add=@htmlPreproc
Então htmlJavaScript é um cluster, definido em html.vim. Existe um cluster semelhante para CSS que podemos usar?
/htmlcss
Sim!
syn include @htmlCss syntax/css.vim
Então, só precisamos substituir @htmlJavascriptpor @htmlCssno containsargumento:
contains=@htmlCss,phpIdentifierSimply,phpIdentifier,[...]
E como eu adiciono a eles?
Salve o comando de sintaxe inteiro abaixo no arquivo ~/after/syntax/php.vimpara que ele seja executado após o restante do processamento da sintaxe do PHP ser executado, e pronto!
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: Veja :help :syn-containspara detalhes.
2: Veja :help :syn-cluster.
3: Liguei 'ignorecase'. Sem ele, você precisará procurar htmlJavascriptou \chtmljavascript
4: De fato, com base no esquema de nomenclatura usado nos arquivos de sintaxe do Vim, provavelmente poderíamos ter descoberto isso com base apenas no htmlJavascriptnome.
5: Com "JavaScript" maiúsculo de forma diferente, desta vez. Sorte que ligamos 'ignorecase', não é?
// This should be syntax-highlightednão é um comentário CSS válido e, portanto, deve ser destacada a sintaxe como algo diferente de um comentário. O CSS suporta apenas/* */comentários de várias linhas.//comentários de linha única são suportados apenas se você usar idiomas de pré-processador, como Sass ou Stylus.