He escrito un modo simple para manejar JSON. Utiliza la maquinaria derivada para reutilizar la mayor parte del código de json-mode. Sin embargo, una adición es que puede insertar elisp en el texto JSON que se evalúa en el momento de envío JSON. Por ejemplo, un extracto de json se ve así:
{
"parameters": {
"IRC_USER": "stsquad",
"PUB_KEY": `(format "\"%s\"" (s-trim (shell-command-to-string "cat ~/.ssh/id_rsa.pub")))`
}
}
Actualmente, el resaltado de sintaxis de este texto está roto cuando el elisp arroja el resaltador de sintaxis JSON. Me gustaría configurar una tabla de sintaxis anidada para que elisp se reconozca correctamente como elisp dentro de los caracteres de escape (he elegido `en este caso). Entiendo que puedes unir char-tables (a partir de las cuales se construyen las tablas de sintaxis) con algo como:
(defvar lava-mode-syntax-table
(let ((json-table (copy-syntax-table json-mode-syntax-table))
(elisp-table (copy-syntax-table lisp-mode-syntax-table)))
(set-char-table-parent elisp-table json-table)
(modify-syntax-entry ?` "(`" json-table)
(modify-syntax-entry ?` ")`" json-table)
json-table)
"LAVA Mode syntax table.
This is a combination of json-mode-syntax-table with an escape into
lisp-mode-syntax table for the embedded elisp.")
Pero no entiendo cómo puedo modificar la tabla de sintaxis para comenzar a usar la tabla de sintaxis secundaria (elisp) mientras estoy entre los caracteres de escape.
fuente
Respuestas:
No desea anidar una tabla de sintaxis (que es una estructura vectorial) dentro de otra, desea configurar un búfer donde, dependiendo de la posición, se usaría una tabla de sintaxis en lugar de la otra.
La otra respuesta describe cómo hacer esto usando la
syntax-table
propiedad de texto. Aquí se explica cómo hacerlo utilizando uno de los paquetes de "modo principal múltiple", mmm-mode . Utilizará todo el modo primario en el nivel superior del búfer y la tabla de sintaxis del submodo, reglas de bloqueo de fuente, mapa de teclas, etc. en las "subregiones".Esto supone que sus archivos de modo mixto tienen nombre
*.el.json
. Ajustar según corresponda.Ahora, instale
mmm-mode
, evalúe lo anterior y (solo entonces) abra uno de los archivos en cuestión.fuente
nxhtml-mode
es bastante torpe, sí.mmm-mode
menos, pero sigue siendo complejo. No estoy seguro si puedes hacer algo como esto enweb-mode
; pregunte a su autor, tal vez.syntax-ppss
caché lo hace.Ok, vamos a aclarar algunos conceptos básicos.
Es posible anidar tablas de sintaxis
Las tablas de sintaxis no tienen que ser globales para todo el búfer. Puede aplicarlos como propiedades de texto a regiones específicas. Esto significa que de hecho puede aplicar la
elisp
tabla de sintaxis solo a regiones rodeadas por backticks.¿Cómo haces eso?
Aquí hay una manera de hacer eso. Este método lo hace inmediatamente antes de que el bloqueo de fuente se ejecute a través del búfer, por lo que debería evitar específicamente sus problemas de bloqueo de fuente.
En su definición de modo mayor, deberá agregar:
Las tablas de sintaxis no son lo mismo que el resaltado de sintaxis
El resaltador de sintaxis (el sistema de bloqueo de fuente) utiliza tablas de sintaxis como parte de su información, por lo que la solución anterior debería evitar que el resaltador se vuelva loco.
Sin embargo, eso es solo una parte de los datos, si también desea que el texto en los backticks tenga el mismo color que vería en un búfer de elisp, tendrá que extender la función anterior para hacerlo específicamente.
fuente
with-silent-modifications
(como lofont-lock-default-fontify-region
hace), pero aún mejor sería mover esteadd-text-properties
negocio asyntax-propertize-function
.