¿Cómo habilito la sintaxis específica del idioma dentro de un heredoc?

19

Cuando edito un archivo PHP y defino una cadena en un heredoc, el resaltado de sintaxis se habilitará dentro del heredoc si es sintaxis JavaScript o sintaxis HTML o sintaxis SQL. Sin embargo, no funcionará para la sintaxis CSS.

Ejemplo (si creamos un nuevo archivo PHP llamado hello.phpcon el siguiente código):

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

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

El JAVASCRIPTbloque está resaltado correctamente, pero el CSSbloque no. Además, si ejecuto SynStackla varpalabra clave en el bloque de código JavaScript, obtengo ['phpRegion', 'phpHereDoc', 'javaScriptIdentifier'], pero si hago lo mismo en cualquier lugar del bloque CSS, solo obtengo ['phpRegion', 'phpHereDoc'], así que necesito agregar algunas reglas de resaltado de sintaxis CSS. ¿Dónde se definen estas reglas de sintaxis y cómo las agrego?

MrSnrub
fuente
1
Nota: // This should be syntax-highlightedno es un comentario CSS válido, por lo que debe resaltarse la sintaxis como algo más que un comentario. CSS solo admite /* */comentarios de varias líneas. //Los comentarios de una sola línea solo son compatibles si utiliza lenguajes de preprocesador como Sass o Stylus.
Rory O'Kane
Estás en lo correcto. He actualizado el código para reflejar ese cambio.
MrSnrub
También estoy buscando obtener una solución para resaltar la sintaxis de CSS heredoc. Intenté muchos escenarios pero no pude hacerlo funcionar. ¿Alguien tiene una solución?
Ken

Respuestas:

3

TL; DR:

Está definido en los archivos de sintaxis PHP y HTML de Vim. Para ver cómo agregar reglas para CSS, vaya a la sección ¿Y cómo las agrego? a continuación, o siga leyendo para obtener una explicación de cómo funciona.

¿Dónde se definen estas reglas de sintaxis?

El JavaScript heredoc se resalta con la función de sintaxis contains1 de Vim , que permite que los grupos de sintaxis contengan otros grupos de sintaxis.

Para encontrar dónde se define esto, primero abra el archivo de resaltado de sintaxis para PHP:

:e $VIMRUNTIME/syntax/php.vim

Ahora, presumiblemente el archivo de sintaxis está encontrando el JavaScript heredoc basado en una coincidencia de la cadena "javascript", así que intentemos buscar eso:

/javascript

El tercer partido es este comentario:

" including HTML,JavaScript,SQL even if not enabled via options

¡Parece prometedor! Echemos un vistazo a la línea de sintaxis 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

( continuaciones de línea agregadas para facilitar la lectura )

Bien, entonces esta región de sintaxis encuentra el JavaScript heredoc con una expresión regular enrevesada, y permite resaltar JavaScript dentro de la región al incluir la @htmlJavascriptsintaxis cluster2 dentro del containsargumento.

¡Pero no hay una definición correspondiente para CSS heredocs! Vamos a agregar uno. Entonces, lo primero que debe cambiar es la startexpresión regular. Simplemente cambie el javascripta css:

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

¡Esto es facil!

Pero no queremos resaltar JavaScript en nuestro CSS heredoc. Por lo tanto, también debemos cambiar el @htmlJavascriptequivalente a CSS. Pero, ¿cuál es el equivalente de CSS? (Es posible que pueda adivinar, pero veamos los movimientos para estar seguros).

Busquemos htmljavascript3 para ver dónde está definido:

/htmljavascript

Hmmm No hay otros resultados. ¡Debe definirse en otra parte! Echemos un vistazo rápido a la parte superior del archivo para ver si podemos encontrar alguna que incluya:

runtime! syntax/html.vim

Parece que podría ser 4 .

:e $VIMRUNTIME/syntax/html.vim

Ejecute la búsqueda nuevamente en este archivo, y encontramos esta línea 5 :

syn cluster htmlJavaScript      add=@htmlPreproc

Entonces htmlJavaScript es un cluster, definido en html.vim. ¿Hay un clúster similar para CSS que podamos usar?

/htmlcss

¡Sip!

syn include @htmlCss syntax/css.vim

Entonces solo necesitamos reemplazar @htmlJavascriptcon @htmlCssen el containsargumento:

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

¿Y cómo los agrego?

Guarde todo el comando de sintaxis a continuación en el archivo ~/after/syntax/php.vimpara que se ejecute después de que se haya llevado a cabo el resto del procesamiento de sintaxis de PHP, ¡y listo!

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: Ver :help :syn-containspara más detalles.
2: ver :help :syn-cluster.
3: me he 'ignorecase'encendido. Sin él, deberá buscar htmlJavascripto \chtmljavascript
4: de hecho, según el esquema de nomenclatura utilizado en los archivos de sintaxis de Vim, probablemente podríamos haberlo resuelto htmlJavascriptsolo con el nombre.
5: Con "JavaScript" capitalizado de manera diferente, esta vez. Suerte que nos hemos 'ignorecase'encendido, ¿eh?

Rico
fuente