首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Vim:在函数中定义语法规则?

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

Stack Overflow用户
提问于 2009-11-17 22:52:31
回答 2查看 263关注 0票数 0

我想在函数中动态创建语法规则。例如,如下所示:

代码语言:javascript
复制
fun! DoStuff(word)
    syntax match Error '\<'.word.'\>' contained
    ... other stuff ...
endf

但是,很明显,这并不管用。所以…我该怎么做呢?

*:Vim脚本仍然是伏都教,就我而言

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2009-11-17 22:54:46

代码语言:javascript
复制
fun! DoStuff(word)
    exec 'syntax match Error /\<'.a:word.'\>/ contained'
endf
票数 5
EN

Stack Overflow用户

发布于 2009-11-18 02:52:33

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

代码语言:javascript
复制
'syntax match Error /\<' . a:word . '\>/ contained'

如果参数是foobar,它会给出:

代码语言:javascript
复制
'syntax match Error /\<foobar\>/ contained'

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

一个次要问题(但在我看来是相当重要的)...

如果您只是简单地在单词周围添加\<\>,请使用syn keyword\<\>是隐含的,并且匹配器的速度更快(如果您有很多关键字,这将对vim的响应速度产生影响)。

在这种情况下,您可以简单地使用命令(尽管如果您尝试执行更复杂的操作,这将不起作用):

代码语言:javascript
复制
:command! -nargs=1 DoStuff syn keyword Error <args> contained
:DoStuff MyKeyword

如果您需要使用函数:

代码语言:javascript
复制
function! DoStuff(word)
    exec 'syntax keyword Error ' . a:word . ' contained'
endfunction

更多信息,这里有一些有用的文档:

代码语言:javascript
复制
:help :syn-keyword
:help :syn-match
:help :command
:help :command-nargs
:help :function
:help :exec

作为一个真正的随机问题,一个鲜为人知的vim事实是,您可以稍微缩短匹配命令,因为exec会自动在参数之间添加空格,因此:

代码语言:javascript
复制
exec 'syntax keyword Error ' . a:word . ' contained'

变成了

代码语言:javascript
复制
exec 'syntax keyword Error' a:word 'contained'

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1749392

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档