2009-08-26 134 views
0

我有一個自定義文件格式的圖形,看起來像這樣:自定義語法VIM高亮鏈接

node1.link1 : node2 
node1.attribute1 : an_attribute_for_node1 
node2.my_attribute1 : an_attribute_for_node2 

(沒有什麼特別的屬性名稱,屬性是當且僅當一個可以找到它的一個鏈接因此node2是一個鏈接,因爲文件中有一行以node2.<something>開頭)。

我想,如果他們的聯繫,突出的屬性值(所以我想強調節點2,但不attribute_for_node1)。

顯然,這種語法高亮的不能僅基於線寬的正則表達式,因爲需要讀取整個文件做正確的高亮顯示。

我已經有這種類型的文件(可提供字典string -> (string -> string)的字典)一個python解析器,但我不知道是否Python可以用語法高亮VIM 7

編輯 互動作爲澄清,對於這個實施例製造的詞典是:

 
d = { 
    'node1': {'link1' : 'node2', 'attribute1' : 'an_attribute_for_node1'}, 
    'node2': {'attribute2': 'an_attribute_for_node2'} 
} 

根據定義,l爲節點n鏈路當且僅當:

 
d[n][l] in d 

名稱是沒有意義的,該格式僅依賴於結構,並沒有語言的關鍵字。 我想在第一行中突出顯示node2,因爲它是節點的名稱。

我希望這是更清晰了。

有人有想法嗎?

回答

2

這應該是很簡單的,但它是一個有點難以制定出你的字典看上去完全像什麼(什麼是「字符串」?節點1?ATTRIBUTE1?別的東西嗎?)。我有一個我編寫的插件叫做ctags highlighter,它做了一個相當類似的事情:它使用ctags生成一個關鍵字列表,然後使用python將它變成一個簡單的vim腳本,以適當地突出顯示這些關鍵字。基本上,你需要做的是讓你的解析器(或使用你的解析器的另一個python模塊)生成一個關鍵字列表(node1,node2等)並以這種形式輸出它們(每行使用很多你喜歡,但不要使線長):

syn keyword GraphNode node1 node2 
syn keyword GraphNode node3 

寫一個文件,並創建一個不一樣的東西自動命令:

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

然後做:

hi GraphNode guifg=blue 

或什麼的。如果你想了解更多細節,可以發佈更多關於解析器的信息,或者查看my plugin中的代碼。

欲瞭解更多信息,請參閱

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

編輯

我還不能完全肯定我知道你想要什麼,但如果我理解正確,這樣的事情應該工作:

我們假設你的Python解析器被稱爲mypyparser.py,它需要一個參數(當前文件名),它創建的字典被稱爲MyPyDict。顯然你必須修改腳本以匹配解析器的實際使用。將此腳本添加到運行時路徑的某處(例如,在.vimrc或〜/ .vim/ftplugin/myfiletype.vim中),然後打開文件並輸入:HighlightNodes

" 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

我很抱歉沒有清楚。 僞(-pseudo)BNF格式的語法是 line:= node'。'屬性':'link |屬性 節點:= [AZ] + 鏈路:=節點 屬性:= [AZ] + 屬性:= [AZ] + ,其從屬性判別的節點的唯一的是,它可以是名稱一個節點 像這樣的我的python字典是{'node1':{'link1':'node1','attribute1':'an_attribute_for_node_1'},'node2':{'my_attribute1':'an_attribute_for_node2'}} l是鏈接節點n iff d [n] [l] in d 因此,node1根本沒有意義。實際上,該語法不是基於關鍵字的。希望這更清楚。 – LeMiz 2009-08-26 12:20:20

+0

我並不是建議您使用基於語言文件的關鍵字,而是基於對當前文件的解析。例如,在我的C代碼中,如果我有一個名爲GetCurrentValue()的函數,我希望GetCurrentValue可以在整個代碼中高亮顯示,儘管它不是C關鍵字。如果我打開一個不同的項目,我不希望GetCurrentValue被突出顯示。我想我要問的是:「在這個文件中,具體來說,'node2'應該在第1行的末尾和第3行的開始,還是第一行中突出顯示?」。 – DrAl 2009-08-26 13:11:46

+0

我已經添加了一個更明確的例子,但是如果我仍然錯了,也許你可以給一個更詳細的例子,用一個示例文件以及爲該文件突出顯示的特定部分和位置? – DrAl 2009-08-26 13:25:12