J'ai écrit un mode simple pour gérer JSON. Il utilise la machinerie dérivée pour réutiliser la plupart du code de json-mode. Cependant, un ajout est que vous pouvez insérer elisp dans le texte JSON qui est évalué au moment de la soumission JSON. Par exemple, un extrait du json ressemble à ceci:
{
"parameters": {
"IRC_USER": "stsquad",
"PUB_KEY": `(format "\"%s\"" (s-trim (shell-command-to-string "cat ~/.ssh/id_rsa.pub")))`
}
}
Actuellement, la mise en évidence de la syntaxe de ce texte est interrompue, car le surligneur de syntaxe JSON est lancé par l'elisp. Je voudrais configurer une table de syntaxe imbriquée pour que l'elisp soit correctement reconnu comme elisp à l'intérieur des caractères d'échappement (j'ai choisi `dans ce cas). Je comprends que vous pouvez joindre des tables de caractères (à partir desquelles les tables de syntaxe sont construites) avec quelque chose comme:
(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.")
Mais je ne comprends pas comment modifier la table de syntaxe pour commencer à utiliser la table de syntaxe enfant (elisp) entre les caractères d'échappement?
la source
Réponses:
Vous ne voulez pas imbriquer une table de syntaxe (qui est une structure vectorielle) dans une autre, vous voulez mettre en place un tampon où, selon la position, une table de syntaxe serait utilisée à la place de l'autre.
L'autre réponse décrit comment procéder à l'aide de la
syntax-table
propriété text. Voici comment le faire en utilisant l'un des packages "mode multiple multiple", mmm-mode . Il utilisera tout le mode principal au niveau supérieur du tampon, et la table de syntaxe du sous-mode, les règles de verrouillage de police, le clavier, etc. dans les "sous-régions".Cela suppose que vos fichiers en mode mixte sont nommés
*.el.json
. Ajustez comme approprié.Maintenant, installez
mmm-mode
, évaluez ce qui précède et (seulement alors) ouvrez l'un des fichiers en question.la source
nxhtml-mode
est plutôt maladroit, oui.mmm-mode
moins, mais c'est toujours complexe. Je ne sais pas si vous pouvez faire quelque chose comme ça dansweb-mode
; demandez à son auteur, peut-être.syntax-ppss
cache le fait.Ok, passons à l'essentiel.
L'imbrication de tables de syntaxe est possible
Les tables de syntaxe n'ont pas besoin d'être globales à l'ensemble du tampon. Vous pouvez les appliquer en tant que propriétés de texte à des régions spécifiques. Cela signifie que vous ne pouvez en effet appliquer la
elisp
table de syntaxe qu'aux régions entourées de backticks.Comment tu fais ça?
Voici une façon de procéder. Cette méthode le fait immédiatement avant l'exécution du verrouillage de police dans le tampon, elle devrait donc spécifiquement empêcher vos problèmes de verrouillage de police.
Dans votre définition de mode principal, vous devrez ajouter:
Les tables de syntaxe ne sont pas identiques à la mise en évidence de la syntaxe
Le surligneur de syntaxe (le système de verrouillage de police) utilise des tables de syntaxe dans le cadre de ses informations, de sorte que la solution ci-dessus devrait empêcher le surligneur de devenir fou.
Cependant, ce n'est qu'une partie des données, si vous souhaitez également que le texte des backticks soit coloré exactement comme vous le verriez dans un tampon elisp, vous devrez étendre la fonction ci-dessus pour le faire spécifiquement.
la source
with-silent-modifications
(comme lefont-lock-default-fontify-region
fait), mais mieux serait de déplacer cetteadd-text-properties
entreprise verssyntax-propertize-function
.