Como habilito a sintaxe específica do idioma em um heredoc?

19

Quando edito um arquivo PHP e defino uma cadeia de caracteres em um heredoc, o destaque da sintaxe será ativado dentro do heredoc, se for a sintaxe JavaScript ou HTML ou SQL. No entanto, não funcionará para a sintaxe CSS.

Exemplo (se criarmos um novo arquivo PHP chamado hello.phpcom o seguinte código):

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

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

O JAVASCRIPTbloco está destacado corretamente, mas o CSSbloco não está. Além disso, se eu executar SynStacka varpalavra-chave no bloco de código JavaScript, recebo ['phpRegion', 'phpHereDoc', 'javaScriptIdentifier'], mas se fizer o mesmo em qualquer lugar no bloco CSS, só o receberei ['phpRegion', 'phpHereDoc'], então preciso adicionar algumas regras de destaque da sintaxe CSS. Onde essas regras de sintaxe estão sendo definidas e como as adiciono?

MrSnrub
fonte
1
Nota: // 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.
Rory O'Kane
Você está certo. Atualizei o código para refletir essa alteração.
precisa saber é o seguinte
Também estou procurando obter uma solução para o realce da sintaxe CSS heredoc. Tentei muitos cenários, mas não consegui fazê-lo funcionar. Alguém tem uma solução?
26717 Ken

Respostas:

3

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 é?

Rico
fonte