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


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?

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.