如何才能将语法匹配仅包含在特定语法区域内而不创建单独的文件?

时间:2017-11-23 20:46:38

标签: vim

是否可以在特定语法区域内匹配语法匹配(非关键字)?我刚才有这个问题并提出了这个问题:

" lua.vim
syntax include @loveconf <sfile>:p:h/love-conf.vim
" Some time later
syntax region loveconfregion start="\<love\.conf\>" end="\<end\>"me=e-3,he=e-3,re=e-3 skipwhite skipempty containedin=ALLBUT,luaString,luaComment contains=ALL
highlight loveconf ctermfg=206

love-conf.vim看起来像这样:

" Simple example; actual file contains a regex
syntax match loveconf "\.window\.width" containedin=loveconfregion

如果可能的话,我希望将它全部移动到一个文件中。有没有办法做到这一点?

作为指南,这是一个示例文件:

-- test.lua
t.window.width = 20
-- ^ Not colored

function randomFunction()
    t.window.width = 20
    -- ^ Also not colored
end

function love.conf( t )
    t.window.width = 20
    -- ^ Colored
end

1 个答案:

答案 0 :(得分:1)

是的,大多数语法脚本都可以使用它。这是一个简短的例子:

#start
match
#end
match

syntax region myRegion start="#start" end="#end" contains=myMatch
syntax match myMatch "match" contained
highlight link myMatch Identifier

您的示例只是错过了contained属性。因此,loveconf匹配任何地方,而不仅仅是loveconfregion内部(通过containedin=):

syntax match loveconf "\.window\.width" contained containedin=loveconfregion

语法包括与一种语法

:syntax include的主要用例是在另一个语言中嵌入(子)语言。突出的例子是HTML内部的JavaScript,或Vimscript中的Python。这样可以避免重复并允许有条件地包含内容(例如,如果Vim不支持它,则Vim语法不会突出显示嵌入式Python)。

另一个用例是一种语法是另一种语言的扩展(例如,Windows Scripting Host是XML)。这通常只是:runtime! syntax/xml.vim