我想在函数内动态创建语法规则。例如,像:
fun! DoStuff(word)
syntax match Error '\<'.word.'\>' contained
... other stuff ...
endf
但是,显然*不起作用。那么......我怎么能这样做?
*:据我所知,Vim脚本仍然是伏都教
答案 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'
......但第一种方式可能更具可读性!