Vim:在函数中定义语法规则?

时间:2009-11-17 14:52:31

标签: vim

我想在函数内动态创建语法规则。例如,像:

fun! DoStuff(word)
    syntax match Error '\<'.word.'\>' contained
    ... other stuff ...
endf

但是,显然*不起作用。那么......我怎么能这样做?

*:据我所知,Vim脚本仍然是伏都教

2 个答案:

答案 0 :(得分:5)

fun! DoStuff(word)
    exec 'syntax match Error /\<'.a:word.'\>/ contained'
endf

答案 1 :(得分:2)

你遇到问题的原因并不是syn match不能在一个函数中使用,而是当它以你所描述的方式使用时,它是字面输入的。我不确定实现的细节是什么,但是我希望它将模式视为\<(用引号分隔),然后在最后会有一些无法识别的字符串。它不会将.视为连接运算符。因此,您必须做的事情(正如Mykola Golubyev正确指出的那样),您必须将命令创建为一个长字符串:

'syntax match Error /\<' . a:word . '\>/ contained'

,如果参数是foobar给出:

'syntax match Error /\<foobar\>/ contained'

然后你必须使用exec来实际运行该命令。

一边(但在我看来非常重要)......

如果您只是在单词周围添加\<\>,请使用syn keyword:隐含\<\>,匹配器为更快(如果您有很多关键字,这会对vim的响应能力产生影响)。

在这种情况下你可以简单地使用一个命令(虽然如果你想要做一些更复杂的事情,这不会起作用):

:command! -nargs=1 DoStuff syn keyword Error <args> contained
:DoStuff MyKeyword

如果您需要使用功能:

function! DoStuff(word)
    exec 'syntax keyword Error ' . a:word . ' contained'
endfunction

有关详细信息,请参阅此处的一些有用文档:

:help :syn-keyword
:help :syn-match
:help :command
:help :command-nargs
:help :function
:help :exec

作为一个非常随意的,一个鲜为人知的vim事实是你可以小数缩短匹配命令,因为exec自动在参数之间添加空格,所以:

exec 'syntax keyword Error ' . a:word . ' contained'

变为

exec 'syntax keyword Error' a:word 'contained'

......但第一种方式可能更具可读性!