Ich habe einen einfachen Modus für den Umgang mit JSON geschrieben. Es verwendet die abgeleitete Maschinerie, um den größten Teil des Codes von json-mode wiederzuverwenden. Eine Ergänzung ist jedoch, dass Sie elisp in den JSON-Text einfügen können, der zum Zeitpunkt der JSON-Übermittlung ausgewertet wird. Zum Beispiel sieht ein Auszug aus dem json so aus:
{
"parameters": {
"IRC_USER": "stsquad",
"PUB_KEY": `(format "\"%s\"" (s-trim (shell-command-to-string "cat ~/.ssh/id_rsa.pub")))`
}
}
Derzeit ist die Syntaxhervorhebung dieses Textes unterbrochen, da der JSON-Syntax-Hightlighter vom Elisp geworfen wird. Ich möchte eine verschachtelte Syntaxtabelle einrichten, damit das Elisp innerhalb der Escape-Zeichen ordnungsgemäß als Elisp erkannt wird (in diesem Fall habe ich `gewählt). Ich verstehe, dass Sie char-Tabellen (aus denen Syntax-Tabellen erstellt werden) mit etwas verbinden können wie:
(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.")
Aber ich verstehe nicht, wie ich die Syntaxtabelle ändern kann, um die untergeordnete Syntax-Tabelle (elisp) zwischen den Escape-Zeichen zu verwenden?
quelle
Antworten:
Sie möchten nicht eine Syntaxtabelle (bei der es sich um eine Vektorstruktur handelt) in eine andere verschachteln, sondern einen Puffer einrichten, in dem je nach Position eine Syntaxtabelle anstelle der anderen verwendet wird.
Die andere Antwort beschreibt, wie dies mithilfe der
syntax-table
text-Eigenschaft durchgeführt wird. Hier erfahren Sie, wie Sie dies mit einem der "Multiple Major Mode" -Pakete, dem mmm-Modus , tun . Es wird alles im Primärmodus auf der obersten Ebene des Puffers und die Syntaxtabelle des Submodus, die Regeln für die Schriftsperre, die Keymap usw. in den "Subregionen" verwendet.Dies setzt voraus, dass Ihre Dateien im gemischten Modus benannt sind
*.el.json
. Passen Sie die Einstellungen entsprechend an.Installieren
mmm-mode
, evaluieren Sie nun das oben Gesagte und öffnen Sie (nur dann) eine der fraglichen Dateien.quelle
nxhtml-mode
ist ziemlich klobig, ja.mmm-mode
weniger, aber es ist immer noch komplex. Ich bin mir nicht sicher, ob Sie so etwas in tun könnenweb-mode
. Fragen Sie vielleicht den Autor.syntax-ppss
funktioniert der Cache.Ok, lassen Sie uns einige Grundlagen klarstellen.
Das Verschachteln von Syntaxtabellen ist möglich
Syntaxtabellen müssen nicht für den gesamten Puffer global sein. Sie können sie als Texteigenschaften auf bestimmte Regionen anwenden. Dies bedeutet, dass Sie die
elisp
Syntaxtabelle tatsächlich nur auf Regionen anwenden können , die von Backticks umgeben sind.Wie machst du das?
Hier ist eine Möglichkeit, wie Sie das tun können. Diese Methode führt dies unmittelbar vor dem Durchlaufen der Schriftsperre durch den Puffer durch, sodass Ihre Probleme beim Sperren von Schriftarten speziell vermieden werden sollten.
In Ihrer Definition für den Hauptmodus müssen Sie Folgendes hinzufügen:
Syntaxtabellen sind nicht dasselbe wie Syntaxhervorhebung
Der Syntax-Textmarker (das Font-Lock-System) verwendet Syntaxtabellen als Teil seiner Informationen, daher sollte die obige Lösung verhindern, dass der Textmarker verrückt wird.
Dies ist jedoch nur ein Teil der Daten. Wenn Sie auch möchten, dass der Text in Backticks genau so gefärbt wird, wie Sie es in einem Elisp-Puffer sehen würden, müssen Sie die obige Funktion erweitern, um dies speziell zu tun.
quelle
with-silent-modifications
(wiefont-lock-default-fontify-region
auch) verwenden, aber noch besser wäre es, diesesadd-text-properties
Geschäft zu verlagernsyntax-propertize-function
.