dot_files/vim-plugins/bundle/xptemplate/syntax/xpt.vim
2017-07-09 00:26:06 +03:00

231 lines
9.5 KiB
VimL

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: