我想在函数中动态创建语法规则。例如,如下所示:
fun! DoStuff(word)
syntax match Error '\<'.word.'\>' contained
... other stuff ...
endf但是,很明显,这并不管用。所以…我该怎么做呢?
*:Vim脚本仍然是伏都教,就我而言
发布于 2009-11-17 22:54:46
fun! DoStuff(word)
exec 'syntax match Error /\<'.a:word.'\>/ contained'
endf发布于 2009-11-18 02:52:33
你遇到问题的原因并不是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'..。但第一种方法可能更具可读性!
https://stackoverflow.com/questions/1749392
复制相似问题