自定义语法VIM高亮链接

自定义语法VIM高亮链接

问题描述:

我有一个自定义文件格式的图形,看起来像这样:自定义语法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,因为它是节点的名称。

我希望这是更清晰了。

有人有想法吗?

这应该是很简单的,但它是一个有点难以制定出你的字典看上去完全像什么(什么是“字符串”?节点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