自定义语法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
我很抱歉没有清楚。 伪(-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
我并不是建议您使用基于语言文件的关键字,而是基于对当前文件的解析。例如,在我的C代码中,如果我有一个名为GetCurrentValue()的函数,我希望GetCurrentValue可以在整个代码中高亮显示,尽管它不是C关键字。如果我打开一个不同的项目,我不希望GetCurrentValue被突出显示。我想我要问的是:“在这个文件中,具体来说,'node2'应该在第1行的末尾和第3行的开始,还是第一行中突出显示?”。 – DrAl 2009-08-26 13:11:46
我已经添加了一个更明确的例子,但是如果我仍然错了,也许你可以给一个更详细的例子,用一个示例文件以及为该文件突出显示的特定部分和位置? – DrAl 2009-08-26 13:25:12