fun! s:GetMark() let cur = [ line( '.' ), col( '.' ) ] call cursor( 0, 0 ) let lnr = search( '^XPTemplate .*mark=..', 'c' ) if lnr == 0 call cursor ( cur ) return ['`', '^', '`^'] endif let line = getline( lnr ) let marks = matchstr( line, '\Vmark=\zs\.\.' ) call cursor ( cur ) return [ marks[0:0], marks[1:1], marks ] endfunction let s:m = s:GetMark() let s:escaped = '\%(\\\\\)\*\\' let s:nonEscaped = \ '\%(' \ . '\%(\[^\\]\|\^\)' \ . '\%(\\\\\)\*' \ . '\)' \ . '\@<=' let s:lr_chars = escape(s:m[2], '\]-^') let s:l = s:nonEscaped . s:m[0] let s:r = s:nonEscaped . s:m[1] let s:lr = s:nonEscaped . '\[' . s:lr_chars . ']' let s:lq = '\%(' . s:l . '\)' let s:rq = '\%(' . s:r . '\)' let s:non_lr_chars = '\[^' . s:lr_chars . ']' let s:l_escaped = s:escaped . s:m[0] let s:r_escaped = s:escaped . s:m[1] let s:lr_escaped = s:escaped . '\[' . s:lr_chars . ']' let s:non_mark_any = '\%(' . s:lr_escaped . '\|' . s:non_lr_chars . '\)\*' setlocal foldmethod=syntax syntax keyword XPTemplateSnippetKey XPTemplate nextgroup=XPTfileMeta skipwhite syntax region XPTfileMeta start=/./ end=/$/ contained syntax match XPTfileMetaPair /\w\+=\S*/ containedin=XPTfileMeta " meta data values syntax match XPTfileMetaValue_mark /=\S\{2}/ containedin=XPTfileMetaPair syntax match XPTfileMetaValue_priority /=\%(all\|spec\|like\|lang\|sub\|personal\)\?\%([+-]\d*\)\?/ containedin=XPTfileMetaPair " meta data keys syntax keyword XPTfileMetaKey_priority prio[rity] containedin=XPTfileMetaPair nextgroup=XPTfileMetaValue_priority syntax keyword XPTfileMetaKey_mark mark containedin=XPTfileMetaPair nextgroup=XPTfileMetaValue_mark " ================================== " XPTvar command to define variables " ================================== syntax match XptVarValue /.*$/ containedin=XptVarBody syntax region XptVarBody matchgroup=XptVarName start=/\$\w\+/ end=/$/ keepend skipwhite nextgroup=XptVarValue syntax keyword XPTSnippetVar XPTvar nextgroup=XptVarBody skipwhite " ================== " XPTinclude command " ================== syntax match XptSnippetIncludeItemDir /\%(\w\+\/\)\+/ containedin=XptSnippetIncludeItem syntax match XptSnippetIncludeItemFile /[a-zA-Z0-9_.*]\+\s*$/ containedin=XptSnippetIncludeItem syntax match XptSnippetIncludeItem /[a-zA-Z0-9_.]\+\/.*/ containedin=XptSnippetIncludeBody syntax region XptSnippetIncludeBody start=/^\s*\\/ end=/^\ze\s*[^\\ ]/ keepend skipwhite syntax keyword XptSnippetInclude XPTinclude nextgroup=XptSnippetIncludeBody skipnl skipwhite syntax keyword XptSnippetInclude XPTembed nextgroup=XptSnippetIncludeBody skipnl skipwhite " TODO escaping syntax match XPTvariable /\$\w\+/ containedin=XPTmeta_value,XPTmeta_simpleHint,XPTxset_value syntax match XPTvariable_quote /{\$\w\+}/ containedin=XPTmeta_value,XPTmeta_simpleHint,XPTxset_value " TODO escaping, quoted syntax region XPTfunction start=/\w\+(/ end=/)/ containedin=XPTmeta_value,XPTmeta_simpleHint,XPTxset_value exe 'syntax match XPTitemPost /\V' . s:non_mark_any . s:rq . '\{1,2}/ contains=XPTmark contained containedin=XPTsnippetBody' " XPTitemB for distinguish coherent item exe 'syntax match XPTitemB /\V' . s:l . '\_.\{-}' . s:r . '/ contains=XPTmark containedin=XPTsnippetBody nextgroup=XPTitemPost,XPTitem' exe 'syntax match XPTitem /\V' . s:l . '\_.\{-}' . s:r . '/ contains=XPTmark containedin=XPTsnippetBody nextgroup=XPTitemPost,XPTitemB' exe 'syntax match XPTinclusion /\VInclude:\zs\.\{-}\ze' . s:r . '/ contained containedin=XPTitem,XPTitemB' exe 'syntax match XPTinclusion /\V:\zs\.\{-}\ze:' . s:r . '/ contained containedin=XPTitem,XPTitemB' exe 'syntax match XPTcursor /\V' . s:l . 'cursor' . s:r . '/ contained containedin=XPTitem,XPTitemB' exe 'syntax match XPTvariable /\V' . '$\w\+' . '/ contained containedin=XPTitem,XPTitemB' exe 'syntax match XPTvariable_quote /\V{' . '$\w\+' . '}/ contained containedin=XPTitem,XPTitemB' exe 'syntax match XPTmark /\V' . s:r . '/ contains=XPTmark containedin=XPTitem,XPTitemB' " the end pattern is weird. " \%(^$)^XPT\s does not work. syntax match XPTxset /^XSET\s\+\%(\w\|[.?*]\)\+\([|.]\%(pre\|def\|post\|ontype\)\)\?=.*/ containedin=XPTsnippetBody syntax region XPTxsetm start=/^XSETm\s\+/ end=/XSETm END$/ containedin=XPTsnippetBody fold syntax keyword XPTkeyword_XSET XSET containedin=XPTxset nextgroup=XPTxset_name1,XPTxset_name2,XPTxset_name3 skipwhite transparent " priorities are low to high syntax match XPTxset_value /.*/ containedin=XPTxset transparent syntax match XPTxset_eq /=/ containedin=XPTxset nextgroup=XPTxset_value transparent syntax match XPTxset_type /[|.]\%(pre\|def\|post\|ontype\)\|\ze=/ containedin=XPTxset nextgroup=XPTxset_eq transparent syntax match XPTxset_name3 /\%(\w\|\.\)*/ containedin=XPTxset nextgroup=XPTxset_type transparent syntax match XPTxset_name2 /\%(\w\|\.\)*\ze\./ containedin=XPTxset nextgroup=XPTxset_type transparent syntax match XPTxset_name1 /\%(\w\|\.\)*\ze|/ containedin=XPTxset nextgroup=XPTxset_type transparent syntax keyword XPTkeyword_XPT XPT nextgroup=XPTsnippetName skipwhite syntax match XPTsnippetTitle /.*$/ contained nextgroup=XPTsnippetBody,XPTkeyword_XPT skipwhite skipnl skipempty syntax match XPTsnippetName /\S\+/ contained nextgroup=XPTmeta,XPTmetaAlias,XPTsnippetTitle,XPTsnippetBody skipwhite skipempty syntax match XPTend /\.\.XPT/ contained containedin=XPTsnippetBody syntax match XPTnotKey /\\XPT/ contained containedin=XPTsnippetBody " escaped white space or non-space syntax match XPTmeta /\w\(\\\s\|\S\)\+/ containedin=XPTsnippetTitle nextgroup=XPTmeta,XPTmetaAlias,XPTmeta_simpleHint skipwhite skipnl skipempty syntax match XPTmeta_simpleHint /\V\(\\\*\)\1"\.\*/ contained containedin=XPTsnippetTitle syntax match XPTmetaAlias /alias=\S\+/ nextgroup=XPTmeta,XPTsnippetBody,XPTkeyword_XPT skipwhite skipnl skipempty syntax match XPTmetaAlias_name /\S\+\ze=/ contained containedin=XPTmetaAlias syntax match XPTmetaAlias_value /=\zs\S\+/ contained containedin=XPTmetaAlias syntax match XPTmeta_name /\w\+\ze=\?/ containedin=XPTmeta nextgroup=XPTmeta_value syntax keyword XPTmeta_name_key hint alias synonym hidden wrap wraponly abbr syn contained containedin=XPTmeta_name syntax match XPTmeta_value /=\zs\(\\\s\|\S\)*/ containedin=XPTmeta syntax region XPTsnippetBody start=/^/ end=/\ze\%(^$\n\)*\%$\|\ze\%(^$\n\)*XPT\s\|^\.\.XPT\|\ze\(^".*\n\|^\s*\n\)*\(^XPT\s\|\%$\|^".*\%$\|^\s*\%$\)/ contained containedin=XPTsnippetTitle contains=XPTxset excludenl fold syntax match XPThintMark /\V \zs**\ze / contained containedin=vimLineComment syntax match vimLineComment /^".*$/ containedin=XPTregion contains=@vimCommentGroup,vimCommentString,vimCommentTitle syntax match XPTbadIndent /^\( \)*\zs \{1,3}\ze\%(\S\|$\)/ contained containedin=XPTsnippetBody syntax match XPTbadIndent /^\s*\zs\t/ contained containedin=XPTsnippetBody " syntax keyword TemplateKey XSETm indent hint syn priority containedin=XPTsnippetTitle " ======================= " Xpt snippets definition " ======================= syntax region XPTregion start=/^/ end=/\%$/ contained contains=XPTsnippetTitle hi def link XPTfileMetaPair Normal hi def link XPTfileMetaKey_priority Identifier hi def link XPTfileMetaValue_priority Constant hi def link XPTfileMetaKey_mark Identifier hi def link XPTfileMetaValue_mark Constant hi def link XptVarBody Error hi def link XptVarName Constant hi def link XptVarValue Normal hi def link XptSnippetIncludeItemFile String hi def link XptSnippetIncludeItemDir Directory hi def link XptSnippetIncludeItem Directory hi def link XptSnippetIncludeBody Normal hi def link XptSnippetInclude Statement hi def link XPTsnippetTitle Statement hi def link XPTsnippetName Label hi def link XPTmeta Normal hi def link XPTmeta_name Error hi def link XPTmeta_name_key Identifier hi def link XPTmeta_value String hi def link XPTmetaAlias_name XPTmeta_name_key hi def link XPTmetaAlias_value XPTsnippetName hi def link XPTmeta_simpleHint Comment hi def link XPTsnippetBody Normal hi def link XPTcomment Comment hi def link XPT_END Folded hi def link XPTxset Comment hi def link XPTxsetm Comment " hi def link XPTxset_name1 Function " hi def link XPTxset_name2 Function " hi def link XPTxset_name3 Function hi def link XPTxset_type Constant hi def link XPTxset_eq Operator hi def link XPTxset_value Normal hi def link XPTregion SpecialKey hi def link XPTitem CursorLine if has('gui_running') hi def link XPTitemB CursorColumn else hi def link XPTitemB XPTitem endif hi def link XPTinclusion XPTsnippetName " hi def link XPTcursor TabLineSel hi def link XPTcursor StatusLine hi def link XPTitemPost WildMenu hi def link XPTvariable Constant hi def link XPTvariable_quote Constant hi def link XPTfunction Function hi def link XPTbadIndent Error " not implemented hi def link XPTmark NonText hi def link TemplateKey Title hi def link XPThintMark Label hi def link XPTemplateSnippetKey Statement hi def link XPTSnippetVar Statement hi def link XPTkeyword_XPT Statement " hi def link XPTkeyword_XSET Comment " hi def link XPTkeyword_XSET Preproc hi def link XPTkeyword_hint Statement " vim: set ts=8 sw=4 sts=4: