2009-08-26 10 views
0

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?

Antwort

2

Das sollte sehr einfach sein, aber es ist ein wenig schwierig, genau herauszufinden, wie dein Diktat aussieht (was ist 'string'? Node1? Attribut1? Etwas anderes?). Ich habe ein Plugin, das ich ctags highlighter geschrieben habe, das eine ziemlich ähnliche Sache tut: es verwendet Ctags, um eine Liste von Schlüsselwörtern zu erzeugen, und verwendet dann Python, um dieses in ein einfaches vim-Skript zu verwandeln, das diese Schlüsselwörter entsprechend hervorhebt.

Grundsätzlich müssen Sie Ihren Parser (oder ein anderes Python-Modul, das Ihren Parser verwendet) dazu bringen, eine Liste von Schlüsselwörtern (node1, node2 usw.) zu generieren und sie in dieser Form ausgeben (verwenden Sie so viele pro Zeile wie Sie wollen, aber nicht über die Linien machen zu lang):

syn keyword GraphNode node1 node2 
syn keyword GraphNode node3 

schreibt diese in eine Datei und erstellen Sie einen automatischen Befehl, dass so etwas tut:

autocmd BufRead,BufNewFile *.myextension if filereadable('nodelist.vim') | source nodelist.vim | endif 

Dann tun:

hi GraphNode guifg=blue 

oder was auch immer. Wenn Sie weitere Informationen wünschen, veröffentlichen Sie ein wenig mehr Informationen zu Ihrem Parser oder schauen Sie sich den Code unter my plugin an.

Weitere Informationen finden Sie

:help :autocmd 
:help syn-keyword 
:help BufEnter 
:help BufNewFile 
:help filereadable() 
:help :source 
:help :highlight 

bearbeiten

Ich bin noch nicht ganz sicher, ob ich weiß, was Sie wollen, aber wenn ich richtig bin zu verstehen, so etwas wie dies funktionieren sollte:

Angenommen, Ihr Python-Parser heißt mypyparser.py, benötigt ein Argument (der aktuelle Dateiname) und das erstellte Wörterbuch heißt MyPyDict. Sie müssen das Skript natürlich an die tatsächliche Verwendung Ihres Parsers anpassen. Fügen Sie dieses Skript irgendwo in Ihrem Laufzeitpfad hinzu (z. B. in .vimrc oder in ~/.vim/ftplugin/myfiletype.vim). Öffnen Sie dann Ihre Datei und geben Sie :HighlightNodes ein.

" Create a command for ease of use 
command! HighlightNodes call HighlightNodes() 
function! HighlightNodes() 
    " Run the parser to create MyPyDict 
    exe 'pyfile mypyparser.py ' . expand('%:p') 
    " Next block is python code (indent gone to keep python happy) 
    py <<EOF 
# Import the Vim interface 
import vim 
# Iterate through the keys in the dictionary and highlight them in Vim 
for key in MyPyDict.keys(): 
    vim.command('syn keyword GraphNode ' + key) 
endfor 
EOF 
    " Make sure that the GraphNode is highlighted in some colour or other 
    hi link GraphNode Keyword 
endfunction 
+0

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

+0

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

+0

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