ich eine benutzerdefinierte Dateiformat für Grafiken haben, die wie folgt aussieht:Benutzerdefinierte Syntax in vim-Markierung für Links
node1.link1 : node2
node1.attribute1 : an_attribute_for_node1
node2.my_attribute1 : an_attribute_for_node2
(es gibt nichts besonderes über die Attribute Namen ist, ist ein Attribut, ein Link iff eine seiner finden Wert auf der linken Seite eines Punktes. So node2
ist ein Link, weil es eine Zeile irgendwo in der Datei gibt, die mit node2.<something>
beginnt).
Ich möchte die Attributwerte hervorheben, wenn sie Links sind (also möchte ich node2 hervorheben, aber nicht attribute_for_node1
).
Offensichtlich kann diese Art der Syntaxhervorhebung nicht nur auf der Leitungsebene regexp basieren, weil man die gesamte Datei lesen muss, um die korrekte Hervorhebung zu machen.
Ich habe bereits einen Python-Parser für diese Art von Dateien (die eine dict von dict string -> (string -> string)
gibt), aber ich weiß nicht, ob Python mit Syntax-Hervorhebung in vim in Wechselwirkung treten kann 7.
EDIT als Klarstellung ist das Wörterbuch für dieses Beispiel hergestellt:
d = { 'node1': {'link1' : 'node2', 'attribute1' : 'an_attribute_for_node1'}, 'node2': {'attribute2': 'an_attribute_for_node2'} }
Per Definition l
ein Link für den Knoten ist n
, wenn und nur wenn:
d[n][l] in d
Namen sind bedeutungslos, das Format ist nur strukturabhängig, und es gibt keine Sprache Schlüsselwörter. Ich möchte node2
in der ersten Zeile hervorheben, weil es der Name für einen Knoten ist.
Ich hoffe, es ist jetzt klarer.
Jemand hat eine Idee?
Es tut mir leid, nicht klar gewesen zu sein. Die Syntax des Formats in Pseudo (-pseudo) BNF ist Zeile: = Knoten '.' Attribut ':' Link | Eigenschaft Knoten: = [aZ] + Link: = Knoten Attribut: = [aZ] + Eigenschaft: = [aZ] + Das einzige, was einen Knoten aus einer Eigenschaft unterscheidet ist, dass es der Name sein kann ein Knoten Mein Python-Diktat wie folgt ist {'node1': {'link1': 'node1', 'attribute1': 'an_attribute_for_node_1'}, 'node2': {'mein_attribut1': 'an_attribute_for_node2'}} l ist a Verbindung für einen Knoten n iff d [n] [l] in d So hat Knoten1 überhaupt keine Bedeutung. Tatsächlich basiert die Syntax NICHT auf Schlüsselwörtern. Hoffe, das ist klarer. – LeMiz
Ich habe nicht vorgeschlagen, dass Sie Schlüsselwörter basierend auf einer Sprachdatei verwenden, sondern basierend auf dem Parsen der aktuellen Datei. Wenn ich zum Beispiel in meinem C-Code eine Funktion namens GetCurrentValue() habe, würde ich erwarten, dass GetCurrentValue im gesamten Code hervorgehoben wird, obwohl es kein C-Schlüsselwort ist. Wenn ich ein anderes Projekt öffne, würde ich nicht erwarten, dass GetCurrentValue hervorgehoben wird. Ich denke, was ich frage ist: "sollte in dieser Datei speziell 'node2' am Ende von Zeile 1 und am Anfang von Zeile 3 oder nur in der ersten Zeile hervorgehoben werden?". – DrAl
Ich habe ein expliziteres Beispiel hinzugefügt, was ich meine, aber wenn ich immer noch falsch liege, könnten Sie vielleicht ein ausführlicheres Beispiel mit einer Beispieldatei und den spezifischen Teilen und Positionen angeben, die Sie für diese Datei markieren möchten? – DrAl