From f39157fbfa8bf050cb129d098958a933de4be869 Mon Sep 17 00:00:00 2001 From: urandom Date: Thu, 18 Dec 2008 10:37:11 +0000 Subject: [PATCH] a vimball script for edc (and embryo). It includes an up-to-date syntax files for edc and embryo, indent and omni-completion scripts git-svn-id: svn+ssh://svn.enlightenment.org/var/svn/e/trunk/edje@38207 7cbeb6ba-43b4-40fd-8cce-4c39aea84d33 --- data/edc.vba | 1319 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 1319 insertions(+) create mode 100644 data/edc.vba diff --git a/data/edc.vba b/data/edc.vba new file mode 100644 index 0000000..59547af --- /dev/null +++ b/data/edc.vba @@ -0,0 +1,1319 @@ +" Vimball Archiver by Charles E. Campbell, Jr., Ph.D. +UseVimball +finish +ftplugin/edc.vim [[[1 +24 +" Vim filetype plugin file +" Language: EDC +" Maintainer: Viktor Kojouharov +" Latest Revision: 2006-10-29 + +if exists("b:did_ftplugin") + finish +endif +let b:did_ftplugin = 1 + +let b:undo_ftplugin = "setl com< cms< inc< fo< efm< mp<" + +setlocal comments=sO:*\ -,mO:*\ \ ,exO:*/,s1:/*,mb:*,ex:*/,:// +setlocal commentstring=/*%s*/ +setlocal formatoptions-=t formatoptions+=croql +setlocal include=^\s*#\s*include +setlocal efm=edje_cc:%s.\ %f:%l\ %m +setlocal mp=edje_cc\ % + +if exists('&ofu') + setlocal ofu=edccomplete#Complete + setlocal cfu=edccomplete#Complete +endif + +syntax/edc.vim [[[1 +225 +" Vim syntax file +" Language: EDC +" Maintainer: Viktor Kojouharov +" Last Change: 2007 02 24 + +" For version 5.x: Clear all syntax items +" For version 6.x: Quit when a syntax file was already loaded +if version < 600 + syntax clear +elseif exists("b:current_syntax") + finish +endif + +" A bunch of useful keywords +syn keyword edcBlock images data fonts collections group contained +syn keyword edcBlock part parts dragable description contained +syn keyword edcBlock text font fill origin size image contained +syn keyword edcBlock programs program styles style contained +syn keyword edcBlock gradient spectra spectrum contained +syn keyword edcBlock color_classes color_class rel1 rel2 contained +syn keyword edcBlock items item contained + +syn keyword edcLabel item name alias min max type effect contained +syn keyword edcLabel mouse_events repeat_events clip_to contained +syn keyword edcLabel x y confine events scale contained +syn keyword edcLabel ignore_flags precise_is_inside contained +syn keyword edcLabel use_alternate_font_metrics entry_mode contained +syn keyword edcLabel source source2 source3 source4 contained +syn keyword edcLabel source5 source6 multiline pointer_mode contained +syn keyword edcLabel state visible step aspect fixed middle contained +syn keyword edcLabel aspect_preference elipsis image contained +syn keyword edcLabel relative offset to to_x to_y contained +syn keyword edcLabel border color color2 color3 font size contained +syn keyword edcLabel signal action transition in contained +syn keyword edcLabel target after fit align contained +syn keyword edcLabel text smooth inherit tag base style contained +syn keyword edcLabel text_source color_class text_class contained +syn keyword edcLabel spectrum angle spread normal tween contained +syn keyword edcLabel padding prefer weight aspect_mode contained +syn keyword edcLabel options layout position span contained +syn keyword edcLabel homogeneous contained + +syn keyword edcConstant COMP RAW LOSSY NONE ON_HOLD AUTOGRAB NOGRAB +syn keyword edcConstant TEXT IMAGE RECT TEXTBLOCK SWALLOW GRADIENT GROUP +syn keyword edcConstant NONE PLAIN OUTLINE SOFT_OUTLINE SHADOW +syn keyword edcConstant SOFT_SHADOW OUTLINE_SHADOW OUTLINE_SOFT_SHADOW +syn keyword edcConstant GLOW FAR_SHADOW FAR_SOFT_SHADOW +syn keyword edcConstant STATE_SET ACTION_STOP SIGNAL_EMIT FOCUS_SET +syn keyword edcConstant DRAG_VAL_SET DRAG_VAL_STEP DRAG_VAL_PAGE +syn keyword edcConstant LINEAR SINUSOIDAL ACCELERATE DECELERATE +syn keyword edcConstant VERTICAL HORIZONTAL BOTH BOX TABLE +syn keyword edcConstant EDITABLE PASSWORD "default" + +syn keyword edcTodo contained TODO FIXME XXX + +syn match edcLabelMatch "\w\+:" contains=edcLabel +syn match edcBlockMatch "\w\+\_s*{" contains=edcBlock +syn match edcBlockMatch "\w\+\.\a"me=e-2 contains=edcBlock +" edcCommentGroup allows adding matches for special things in comments +syn cluster edcCommentGroup contains=edcTodo + +" String and Character constants +" Highlight special characters (those which have a backslash) differently +syn match edcSpecial display contained "\\\(x\x\+\|\o\{1,3}\|.\|$\)" +syn region edcString start=+L\="+ skip=+\\\\\|\\"+ end=+"+ contains=edcSpecial +syn match edcFormat display "%\(\d\+\$\)\=[-+' #0*]*\(\d*\|\*\|\*\d\+\$\)\(\.\(\d*\|\*\|\*\d\+\$\)\)\=\([hlL]\|ll\)\=\([diuoxXfeEgGcCsSpn]\|\[\^\=.[^]]*\]\)" contained +syn match edcFormat display "%%" contained +syn region edcString start=+L\="+ skip=+\\\\\|\\"+ end=+"+ contains=cSpecial,cFormat + +syn match edcCharacter "L\='[^\\]'" +syn match edcCharacter "L'[^']*'" contains=edcSpecial +syn match edcSpecialError "L\='\\[^'\"?\\abfnrtv]'" +syn match edcSpecialCharacter "L\='\\['\"?\\abfnrtv]'" +syn match edcSpecialCharacter display "L\='\\\o\{1,3}'" +syn match edcSpecialCharacter display "'\\x\x\{1,2}'" +syn match edcSpecialCharacter display "L'\\x\x\+'" + +"when wanted, highlight trailing white space +if exists("edc_space_errors") + if !exists("edc_no_trail_space_error") + syn match edcSpaceError display excludenl "\s\+$" + endif + if !exists("edc_no_tab_space_error") + syn match edcSpaceError display " \+\t"me=e-1 + endif +endif + +"catch errors caused by wrong parenthesis and brackets +syn cluster edcParenGroup contains=edcParenError,edcIncluded,edcSpecial,edcCommentSkip,edcCommentString,edcComment2String,@edcCommentGroup,edcCommentStartError,edcUserCont,edcUserLabel,edcBitField,edcCommentSkip,edcOctalZero,edcFormat,edcNumber,edcFloat,edcOctal,edcOctalError,edcNumbersCom +if exists("edc_no_bracket_error") + syn region edcParen transparent start='(' end=')' contains=ALLBUT,@edcParenGroup + syn match edcParenError display ")" + syn match edcErrInParen display contained "[{}]" +else + syn region edcParen transparent start='(' end=')' contains=ALLBUT,@edcParenGroup,edcErrInBracket + syn match edcParenError display "[\])]" + syn match edcErrInParen display contained "[\]{}]" + syn region edcBracket transparent start='\[' end=']' contains=ALLBUT,@edcParenGroup,edcErrInParen + syn match edcErrInBracket display contained "[);{}]" +endif + +"integer number, or floating point number without a dot and with "f". +syn case ignore +syn match edcNumbers display transparent "\<\d\|\.\d" contains=edcNumber,edcFloat,edcOctalError,edcOctal +" Same, but without octal error (for comments) +syn match edcNumbersCom display contained transparent "\<\d\|\.\d" contains=edcNumber,edcFloat,edcOctal +syn match edcNumber display contained "\d\+\(u\=l\{0,2}\|ll\=u\)\>" +"hex number +syn match edcNumber display contained "0x\x\+\(u\=l\{0,2}\|ll\=u\)\>" +" Flag the first zero of an octal number as something special +syn match edcOctal display contained "0\o\+\(u\=l\{0,2}\|ll\=u\)\>" contains=edcOctalZero +syn match edcOctalZero display contained "\<0" +syn match edcFloat display contained "\d\+f" +"floating point number, with dot, optional exponent +syn match edcFloat display contained "\d\+\.\d*\(e[-+]\=\d\+\)\=[fl]\=" +"floating point number, starting with a dot, optional exponent +syn match edcFloat display contained "\.\d\+\(e[-+]\=\d\+\)\=[fl]\=\>" +"floating point number, without dot, with exponent +syn match edcFloat display contained "\d\+e[-+]\=\d\+[fl]\=\>" +" flag an octal number with wrong digits +syn match edcOctalError display contained "0\o*[89]\d*" +syn case match + +if exists("edc_comment_strings") + " A comment can contain edcString, edcCharacter and edcNumber. + " But a "*/" inside a edcString in a edcComment DOES end the comment! So we + " need to use a special type of edcString: edcCommentString, which also ends + " on "*/", and sees a "*" at the start of the line as comment again. + " Unfortunately this doesn't very well work for // type of comments :-( + syntax match edcCommentSkip contained "^\s*\*\($\|\s\+\)" + syntax region edcCommentString contained start=+L\=\\\@" skip="\\$" end="$" end="//"me=s-1 contains=edcComment,edcCharacter,edcParenError,edcNumbers,edcCommentError,edcSpaceError +syn match edcPreCondit display "^\s*#\s*\(else\|endif\)\>" +syn region edcIncluded display contained start=+"+ skip=+\\\\\|\\"+ end=+"+ +syn match edcIncluded display contained "<[^>]*>" +syn match edcInclude display "^\s*#\s*include\>\s*["<]" contains=edcIncluded +syn cluster edcPreProcGroup contains=edcPreCondit,edcIncluded,edcInclude,edcDefine,edcErrInParen,edcErrInBracket,edcCommentSkip,edcCommentString,edcComment2String,@edcCommentGroup,edcCommentStartError,edcParen,edcBracket,edcMulti,edcUserLabel +syn cluster edcAlphaNum contains=edcSpecial,edcOctalZero,edcFormat,edcNumber,edcFloat,edcOctal,edcOctalError,edcNumbersCom,edcString +syn region edcDefine start="^\s*#\s*\(define\|undef\)\>" skip="\\$" end="$" end="//"me=s-1 contains=ALLBUT,@edcPreProcGroup +syn region edcPreProc start="^\s*#\s*\(pragma\>\|line\>\|warning\>\|warn\>\|error\>\)" skip="\\$" end="$" keepend contains=ALLBUT,@edcPreProcGroup + +syn match edcUserLabel display "\I\i*" contained + +syn include @edcEmbryo syntax/embryo.vim +unlet b:current_syntax +syn region edcScript matchgroup=edcScriptTag start="\= 508 || !exists("did_edc_syn_inits") + if version < 508 + let did_edc_syn_inits = 1 + command -nargs=+ HiLink hi link + else + command -nargs=+ HiLink hi def link + endif + + HiLink edcFormat edcSpecial + HiLink edcCommentL edcComment + HiLink edcCommentStart edcComment + HiLink edcLabel Label + HiLink edcUserLabel Label + HiLink edcConditional Conditional + HiLink edcRepeat Repeat + HiLink edcCharacter Character + HiLink edcSpecialCharacter cSpecial + HiLink edcNumber Number + HiLink edcOctal Number + HiLink edcOctalZero PreProc " link this to Error if you want + HiLink edcFloat Float + HiLink edcOctalError edcError + HiLink edcParenError edcError + HiLink edcErrInParen edcError + HiLink edcErrInBracket edcError + HiLink edcCommentError edcError + HiLink edcCommentStartError edcError + HiLink edcSpaceError edcError + HiLink edcSpecialError edcError + HiLink edcOperator Operator + HiLink edcStructure Structure + HiLink edcStorageClass StorageClass + HiLink edcInclude Include + HiLink edcPreProc PreProc + HiLink edcDefine Macro + HiLink edcIncluded edcString + HiLink edcError Error + HiLink edcBlock Function + HiLink edcScriptTag Function + HiLink edcPreCondit PreCondit + HiLink edcConstant Constant + HiLink edcCommentString edcString + HiLink edcComment2String edcString + HiLink edcCommentSkip edcComment + HiLink edcString String + HiLink edcComment Comment + HiLink edcSpecial SpecialChar + HiLink edcTodo Todo + + delcommand HiLink +endif + +let b:current_syntax = "edc" + +" vim: ts=8 +indent/edc.vim [[[1 +83 +" Vim indent file +" Language: EDC +" Maintainer: Viktor Kojouharov +" Latest Revision: 2007 02 24 + +if exists("b:did_indent") + finish +endif +let b:did_indent = 1 + +setlocal indentexpr=GetEDCIndent() +setlocal indentkeys=0{,0},!^F,o,O + +if exists("*GetEDCIndent") + finish +endif + +function s:prevnonblanknoncomment(lnum) + let lnum = a:lnum + while lnum > 1 + let lnum = prevnonblank(lnum) + let line = getline(lnum) + if line =~ '\*/' + while lnum > 1 && line !~ '/\*' + let lnum -= 1 + endwhile + if line =~ '^\s*/\*' + let lnum -= 1 + else + break + endif + elseif line =~ '^\s*//' + let lnum -= 1 + else + break + endif + endwhile + return lnum +endfunction + +function s:count_braces(lnum, count_open) + let n_open = 0 + let n_close = 0 + let line = getline(a:lnum) + let pattern = '[{}]' + let i = match(line, pattern) + while i != -1 + if synIDattr(synID(a:lnum, i + 1, 0), 'name') !~ 'c\%(CommentL\|Comment\|StringQ\{1,2}\)' + if line[i] == '{' + let n_open += 1 + elseif line[i] == '}' + if n_open > 0 + let n_open -= 1 + else + let n_close += 1 + endif + endif + endif + let i = match(line, pattern, i + 1) + endwhile + return a:count_open ? n_open : n_close +endfunction + +function GetEDCIndent() + let line = getline(v:lnum) + if line =~ '^\s*\*' || line =~ '^\s*//' || line =~ '^\s*}' + return cindent(v:lnum) + endif + + let pnum = s:prevnonblanknoncomment(v:lnum - 1) + if pnum == 0 + return 0 + endif + + let ind = indent(pnum) + s:count_braces(pnum, 1) * &sw + + let pline = getline(pnum) + if pline =~ '}\s*$' + let ind -= (s:count_braces(pnum, 0) - (pline =~ '^\s*}' ? 1 : 0)) * &sw + endif + + return ind +endfunction +ftdetect/edc.vim [[[1 +3 +au BufRead,BufNewFile *.edc set filetype=edc +au BufRead,BufNewFile *.sma set filetype=embryo +au BufRead,BufNewFile *.embryo set filetype=embryo +autoload/edccomplete.vim [[[1 +774 +" Vim completion script +" Language: EDC +" Maintainer: Viktor Kojouharov +" Last Change: 2007 02 24 + +function! edccomplete#Complete(findstart, base) + if a:findstart + " locate the start of the word + let line = getline('.') + let start = col('.') - 1 + let compl_begin = col('.') - 2 + let lastword = -1 + if line =~ ':' && line !~ '\.' + while start > 0 && (line[start - 1] =~ '\k' || line[start - 1] =~ '"') + let start -= 1 + endwhile + else + while start > 0 + if line[start - 1] =~ '\k' + let start -= 1 + elseif line[start - 1] =~ '\.' + if lastword == -1 + let lastword = start - 2 + endif + let start -= 1 + else + break + endif + endwhile + endif + let b:compl_context = getline('.')[0:compl_begin] + + if lastword == -1 + let ppe = searchpos('\.', 'bcn') + let pps = searchpos('\w\+\.', 'bcn') + let b:sparent = '' + if ppe != [0, 0] && pps[0] == ppe[0] && pps[1] <= ppe[1] && pps[0] == line('.') + let b:scontext = line[pps[1] -1 : ppe[1] - 2] + call edccomplete#FindParent(pps[0], pps[1]) + return start + endif + + let startpos = searchpair('{', '', '}', 'bnW') + let lnum = startpos + let line = getline(lnum) + + if line !~ '\a\+' + let lnum = prevnonblank(lnum - 1) + let line = getline(lnum) + endif + + call edccomplete#FindParent(lnum, 1) + let b:scontext = matchstr(line, '\w\+') + + return start + else + let b:scontext = line[start : lastword] + + return lastword + 2 + endif + else + " find months matching with "a:base" + let res = [] + if exists("b:compl_context") + let line = b:compl_context + unlet! b:compl_context + else + let line = a:base + endif + + if b:scontext == 'part' + call edccomplete#AddLabel(res, line, a:base, s:partLabel) + call edccomplete#AddStatement(res, line, a:base, s:partStatement) + if line =~ 'type:\s*' + call edccomplete#AddKeyword(res, a:base, s:partTypes) + elseif line =~ 'effect:\s*' + call edccomplete#AddKeyword(res, a:base, s:partEffects) + elseif line =~ 'ignore_flags:\s*' + call edccomplete#AddKeyword(res, a:base, s:partIgnoreFlags) + elseif line =~ 'pointer_mode:\s*' + call edccomplete#AddKeyword(res, a:base, s:partPointerMode) + elseif line =~ 'editable_mode:\s*' + call edccomplete#AddKeyword(res, a:base, s:partEditableMode) + endif + if line =~ 'image:\s*".\{-}"' + call edccomplete#AddKeyword(res, a:base, s:imageStorageMethod) + endif + + elseif b:scontext == 'dragable' + call edccomplete#AddLabel(res, line, a:base, s:dragableLabel) + + elseif b:scontext == 'description' + call edccomplete#AddLabel(res, line, a:base, s:descriptionLabel) + call edccomplete#AddStatement(res, line, a:base, s:descriptionStatement) + if line =~ 'aspect_preference:\s*' + call edccomplete#AddKeyword(res, a:base, s:aspectPrefTypes) + elseif line =~ 'inherit:\s*"\?' + call edccomplete#FindStates(res, a:base, 1) + endif + + elseif b:scontext == 'rel1' || b:scontext == 'rel2' + call edccomplete#AddLabel(res, line, a:base, s:relLabel) + if line =~ 'to\%(_[xy]\)\?:\s*"\?' + call edccomplete#FindNamesIn(res, a:base, 'parts') + endif + + elseif b:scontext == 'image' + call edccomplete#AddLabel(res, line, a:base, s:imageLabel) + call edccomplete#AddStatement(res, line, a:base, s:imageStatement) + if line =~ 'image:\s*".\{-}"' + call edccomplete#AddKeyword(res, a:base, s:imageStorageMethod) + endif + + elseif b:scontext == 'fill' + call edccomplete#AddLabel(res, line, a:base, s:fillLabel) + call edccomplete#AddStatement(res, line, a:base, s:fillStatement) + + elseif b:scontext == 'origin' || b:scontext == 'size' + call edccomplete#AddLabel(res, line, a:base, s:fillInnerStatement) + + elseif b:scontext == 'text' + call edccomplete#AddLabel(res, line, a:base, s:textLabel) + call edccomplete#AddStatement(res, line, a:base, s:textStatement) + + elseif b:scontext == 'program' + call edccomplete#AddLabel(res, line, a:base, s:programLabel) + call edccomplete#AddStatement(res, line, a:base, s:programStatement) + if line =~ 'transition:\s*' + call edccomplete#AddKeyword(res, a:base, s:transitionTypes) + elseif line =~ 'STATE_SET\s*"\?' + call edccomplete#FindStates(res, a:base, 0) + elseif line =~ 'action:\s*' + call edccomplete#AddKeyword(res, a:base, s:actionTypes) + elseif line =~ 'target:\s*"\?' + call edccomplete#FindNamesIn(res, a:base, 'parts') + elseif line =~ 'after:\s*"\?' + call edccomplete#FindNamesIn(res, a:base, 'programs') + endif + + elseif b:scontext == 'programs' + call edccomplete#AddLabel(res, line, a:base, s:programsLabel) + call edccomplete#AddStatement(res, line, a:base, s:programsStatement) + if line =~ 'image:\s*".\{-}"' + call edccomplete#AddKeyword(res, a:base, s:imageStorageMethod) + endif + + elseif b:scontext == 'box' && b:sparent == 'part' + call edccomplete#AddStatement(res, line, a:base, s:boxStatement) + + elseif b:scontext == 'items' + call edccomplete#AddStatement(res, line, a:base, s:boxItemsStatement) + + elseif b:scontext == 'item' + call edccomplete#AddLabel(res, line, a:base, s:boxItemLabel) + if line =~ 'type:\s*' + call edccomplete#AddKeyword(res, a:base, s:boxItemTypes) + elseif line =~ 'aspect_mode:\s*"\?' + call edccomplete#AddKeyword(res, a:base, s:boxItemAspectMode) + endif + + elseif b:scontext == 'box' && b:sparent == 'description' + call edccomplete#AddLabel(res, line, a:base, s:boxDescLabel) + if line =~ 'layout:\s*' + call edccomplete#AddKeyword(res, a:base, s:boxLayout) + endif + + elseif b:scontext == 'table' && b:sparent == 'description' + call edccomplete#AddLabel(res, line, a:base, s:tableDescLabel) + if line =~ 'homogeneous:\s*' + call edccomplete#AddKeyword(res, a:base, s:tableHomogeneousMode) + endif + + elseif b:scontext == 'group' + call edccomplete#AddLabel(res, line, a:base, s:groupLabel) + call edccomplete#AddStatement(res, line, a:base, s:groupStatement) + if line =~ 'image:\s*".\{-}"' + call edccomplete#AddKeyword(res, a:base, s:imageStorageMethod) + endif + + elseif b:scontext == 'parts' + call edccomplete#AddLabel(res, line, a:base, s:partsLabel) + call edccomplete#AddStatement(res, line, a:base, s:partsStatement) + if line =~ 'image:\s*".\{-}"' + call edccomplete#AddKeyword(res, a:base, s:imageStorageMethod) + endif + + elseif b:scontext == 'data' + call edccomplete#AddLabel(res, line, a:base, s:dataLabel) + + elseif b:scontext == 'fonts' + call edccomplete#AddLabel(res, line, a:base, s:fontsLabel) + + elseif b:scontext == 'spectra' + call edccomplete#AddStatement(res, line, a:base, s:spectraStatement) + + elseif b:scontext == 'spectrum' + call edccomplete#AddLabel(res, line, a:base, s:spectrumLabel) + + elseif b:scontext == 'gradient' + call edccomplete#AddLabel(res, line, a:base, s:gradientLabel) + call edccomplete#AddStatement(res, line, a:base, s:gradientStatement) + + elseif b:scontext == 'styles' + call edccomplete#AddStatement(res, line, a:base, s:stylesStatement) + + elseif b:scontext == 'style' + call edccomplete#AddLabel(res, line, a:base, s:styleLabel) + + elseif b:scontext == 'color_classes' + call edccomplete#AddStatement(res, line, a:base, s:color_classesStatement) + + elseif b:scontext == 'color_class' + call edccomplete#AddLabel(res, line, a:base, s:color_classLabel) + + elseif b:scontext == 'images' + call edccomplete#AddLabel(res, line, a:base, s:imagesLabel) + if line =~ 'image:\s*".\{-}"' + call edccomplete#AddKeyword(res, a:base, s:imageStorageMethod) + endif + + elseif b:scontext == 'collections' + call edccomplete#AddLabel(res, line, a:base, s:collectionsLabel) + call edccomplete#AddStatement(res, line, a:base, s:collectionsStatement) + if line =~ 'image:\s*".\{-}"' + call edccomplete#AddKeyword(res, a:base, s:imageStorageMethod) + endif + + elseif strlen(b:scontext) == 0 + call edccomplete#AddStatement(res, line, a:base, s:topStatement) + endif + + unlet! b:scontext + + return res + endif +endfunction + +function! edccomplete#AddLabel(res, line, base, label) + if a:line =~ ':' + return + endif + + for m in sort(keys(a:label)) + if m =~ '^' . a:base + call add(a:res, {'word': m . ':', 'menu': a:label[m]}) + endif + endfor +endfunction + +function! edccomplete#AddKeyword(res, base, label) + for m in sort(keys(a:label)) + if m =~ '^' . a:base + call add(a:res, {'word': m, 'menu': a:label[m]}) + endif + endfor +endfunction + +function! edccomplete#AddStatement(res, line, base, statement) + if a:line =~ ':' + return + endif + + for m in sort(a:statement) + if m =~ '^' . a:base + call add(a:res, m . ' {') + endif + endfor +endfunction + +function! edccomplete#FindStates(res, base, in_part) + let curpos = getpos('.') + call remove(curpos, 0, 0) + + let states_list = [] + if a:in_part == 1 " in the current part only + let part_start = search('^[ \t}]*\[ \t{]*$', 'bnW') + if part_start != 0 " found it + let line = getline(part_start) + if line !~ '{' + let part_start = nextnonblank(part_start) + endif + call cursor(part_start, 0) + let part_end = searchpair('{', '', '}', 'nW') + endif + else " in the current parts group + let part_start = search('^[ \t}]*\[ \t{]*$', 'bnW') + if part_start != 0 " found it + let line = getline(part_start) + if line !~ '{' + let part_start = nextnonblank(part_start) + endif + call cursor(part_start, 0) + let part_end = searchpair('{', '', '}', 'nW') + endif + endif + + let state_num = search('\%(state:\s*\)"\w\+"', 'W', part_end) + while state_num + let state = matchstr(getline(state_num), '\%(state:\s*\)\@<="\w\+"') + call extend(states_list, [state]) + let state_num = search('\%(state:\s*\)"\w\+"', 'W', part_end) + endwhile + call cursor(curpos) + + for m in sort(states_list) + if m =~ '^' . a:base + call add(a:res, m) + endif + endfor +endfunction + +function! edccomplete#FindNamesIn(res, base, str) + let curpos = getpos('.') + call remove(curpos, 0, 0) + + let names_list = [] + let part_start = search('^[ \t}]*\<' . a:str . '\>[ \t{]*$', 'bnW') + if part_start != 0 " found it + let line = getline(part_start) + if line !~ '{' + let part_start = nextnonblank(part_start) + endif + call cursor(part_start, 0) + let part_end = searchpair('{', '', '}', 'nW') + endif + + let name_num = search('\%(name:\s*\)"\w\+"', 'W', part_end) + while name_num + let name = matchstr(getline(name_num), '\%(name:\s*\)\@<="\w\+"') + call extend(names_list, [name]) + let name_num = search('\%(name:\s*\)"\w\+"', 'W', part_end) + endwhile + call cursor(curpos) + + for m in sort(names_list) + if m =~ '^' . a:base + call add(a:res, m) + endif + endfor +endfunction + +function! edccomplete#FindParent(lnum, cnum) + call setpos('.', [0, a:lnum, a:cnum, 0]) + let ppe = searchpos('\.', 'bcn') + let pps = searchpos('\w\+\.', 'bcn') + if ppe != [0, 0] && pps[0] == ppe[0] && pps[1] <= ppe[1] && pps[0] == line('.') + let b:sparent = line[pps[1] -1 : ppe[1] - 2] + return + endif + + let startpos = searchpair('{', '', '}', 'bnW') + let lnum = startpos + let line = getline(lnum) + + if line !~ '\a\+' + let line = getline(prevnonblank(lnum - 1)) + endif + + let b:sparent = matchstr(line, '\w\+') +endfunction + +" part +let s:partLabel = { + \ 'name': '"string"', + \ 'type': '"keyword"', + \ 'effect': '"keyword"', + \ 'ignore_flags': '"keyword" ...', + \ 'pointer_mode': '"keyword"', + \ 'mouse_events': '"bool"', + \ 'repeat_events': '"bool"', + \ 'scale': '"bool"', + \ 'precise_is_inside': '"bool"', + \ 'use_alternate_font_metrics': '"bool"', + \ 'clip_to': '"string"', + \ 'source': '"string"', + \ 'image': '"string" "keyword"', + \ 'font': '"string" "string"', + \ 'entry_mode': '"keyword"', + \ } +let s:partStatement = [ + \ 'dragable', + \ 'images', + \ 'fonts', + \ 'description', + \ 'styles', + \ 'color_classes', + \ 'program', + \ 'programs', + \ 'box', + \ ] + +" dragable +let s:dragableLabel = { + \ 'x': '"bool" "int" "int"', + \ 'y': '"bool" "int" "int"', + \ 'confine': '"string"', + \ 'events': '"string"', + \ } + +" description +let s:descriptionLabel = { + \ 'state': '"string" "float"', + \ 'inherit': '"string" "float"', + \ 'visible': '"bool"', + \ 'align': '"float" "float"', + \ 'fixed': '"float" "float"', + \ 'min': '"int" "int"', + \ 'max': '"int" "int"', + \ 'step': '"int" "int"', + \ 'aspect': '"float" "float"', + \ 'aspect_preference': '"keyword"', + \ 'color_class': '"string"', + \ 'color': '"int" "int" "int" "int"', + \ 'color2': '"int" "int" "int" "int"', + \ 'color3': '"int" "int" "int" "int"', + \ 'font': '"string" "string"', + \ } +let s:descriptionStatement = [ + \ 'rel1', + \ 'rel2', + \ 'image', + \ 'fill', + \ 'text', + \ 'gradient', + \ 'images', + \ 'fonts', + \ 'styles', + \ 'color_classes', + \ 'program', + \ 'programs', + \ 'box', + \ ] + +" rel +let s:relLabel = { + \ 'relative': '"float" "float"', + \ 'offset': '"int" "int"', + \ 'to': '"string"', + \ 'to_x': '"string"', + \ 'to_y': '"string"', + \ } + +" image +let s:imageStatement = [ + \ 'images', + \ ] +let s:imageLabel = { + \ 'image': '"string" "keyword"', + \ 'normal': '"string"', + \ 'tween': '"string"', + \ 'border': '"int" "int" "int" "int"', + \ 'middle': '"bool"', + \ } + +" fill +let s:fillLabel = { + \ 'smooth': '"bool"', + \ 'angle': '"0-360"', + \ 'spread': '"bool"', + \ } +let s:fillStatement = [ + \ 'origin', + \ 'size', + \ ] +" fill origin/size +let s:fillInnerStatement = { + \ 'relative': '"float" "float"', + \ 'offset': '"int" "int"', + \ } + +" text +let s:textLabel = { + \ 'text': '"string"', + \ 'text_class': '"string"', + \ 'font': '"string"', + \ 'style': '"string"', + \ 'size': '"int"', + \ 'fit': '"bool" "bool"', + \ 'min': '"bool" "bool"', + \ 'max': '"bool" "bool"', + \ 'align': '"float" "float"', + \ 'elipsis': '"float"', + \ 'source': '"string"', + \ 'text_source': '"string"', + \ } +let s:textStatement = [ + \ 'fonts', + \ ] + +" program +let s:programLabel = { + \ 'name': '"string"', + \ 'signal': '"string"', + \ 'source': '"string"', + \ 'action': '"keyword" ...', + \ 'transition': '"keyword" "float"', + \ 'target': '"string"', + \ 'after': '"string"', + \ 'in': '"float" "float"', + \ } +let s:programStatement = [ + \ 'script', + \ ] + + +" programs +let s:programsLabel = { + \ 'image': '"string" "keyword"', + \ 'font': '"string" "string"', + \ } +let s:programsStatement = [ + \ 'images', + \ 'fonts', + \ 'program', + \ ] + +" box and table +let s:boxStatement = [ + \ 'items', + \ ] +let s:boxItemsStatement = [ + \ 'item', + \ ] +let s:boxItemLabel = { + \ 'type': '"keyword"', + \ 'name': '"string"', + \ 'source': '"string" # Group name', + \ 'min': '"int" "int"', + \ 'prefer': '"int" "int"', + \ 'max': '"int" "int"', + \ 'padding': '"int" "int" "int" "int"', + \ 'align': '"float" "float"', + \ 'weight': '"float" "float"', + \ 'aspect': '"float" "float"', + \ 'aspect_mode': '"keyword"', + \ 'options': '"string"', + \ } +let s:boxDescLabel = { + \ 'layout': '"string" ["string"]', + \ 'align': '"float" "float"', + \ 'padding': '"int" "int"', + \ } +let s:tableItemLabel = { + \ 'position': '"int" "int"', + \ 'span': '"int" "int"', + \ } +let s:tableDescLabel = { + \ 'homogeneous': '"keyword"', + \ 'align': '"float" "float"', + \ 'padding': '"int" "int"', + \ } + +" group +let s:groupLabel = { + \ 'name': '"string"', + \ 'alias': '"string"', + \ 'min': '"int" "int"', + \ 'max': '"int" "int"', + \ 'image': '"string" "keyword"', + \ 'font': '"string" "string"', + \ } +let s:groupStatement = [ + \ 'data', + \ 'script', + \ 'parts', + \ 'images', + \ 'fonts', + \ 'styles', + \ 'color_classes', + \ 'program', + \ 'programs', + \ ] + +" parts +let s:partsStatement = [ + \ 'images', + \ 'fonts', + \ 'part', + \ 'styles', + \ 'color_classes', + \ 'program', + \ 'programs', + \ ] +let s:partsLabel = { + \ 'image': '"string" "keyword"', + \ 'font': '"string" "string"', + \ } + +" data +let s:dataLabel = { + \ 'item': '"string" "string" ...', + \ } + +" fonts +let s:fontsLabel = { + \ 'font': '"string" "string"', + \ } + +"images +let s:imagesLabel = { + \ 'image': '"string" "keyword"', + \ } + +"collections +let s:collectionsStatement = [ + \ 'group', + \ 'images', + \ 'fonts', + \ 'styles', + \ 'color_classes', + \ ] +let s:collectionsLabel = { + \ 'image': '"string" "keyword"', + \ 'font': '"string" "string"', + \ } + +" spectra +let s:spectraStatement = [ + \ 'spectrum', + \ ] +" spectrum +let s:spectrumLabel = { + \ 'name': '"string"', + \ 'color': '"int" "int" "int" "int" "int"', + \ } +" gradient +let s:gradientLabel = { + \ 'type': '"string"', + \ 'spectrum': '"string"', + \ } +let s:gradientStatement = [ + \ 'rel1', + \ 'rel2', + \ ] + +" styles +let s:stylesStatement = [ + \ 'style', + \ ] +" style +let s:styleLabel = { + \ 'name': '"string"', + \ 'base': '"string"', + \ 'tag': '"string"', + \ } + +" color_classes +let s:color_classesStatement = [ + \ 'color_class', + \ ] +" color_class +let s:color_classLabel = { + \ 'name': '"string"', + \ 'color': '"int" "int" "int" "int"', + \ 'color2': '"int" "int" "int" "int"', + \ 'color3': '"int" "int" "int" "int"', + \ } + +" toplevel +let s:topStatement = [ + \ 'fonts', + \ 'images', + \ 'data', + \ 'collections', + \ 'spectra', + \ 'styles', + \ 'color_classes', + \ ] + +" images image storage method +let s:imageStorageMethod = { + \ 'COMP': '', + \ 'RAW': '', + \ 'LOSSY': '0-100', + \ } + +" part types +let s:partTypes = { + \ 'TEXT': '', + \ 'IMAGE': '', + \ 'RECT': '', + \ 'TEXTBLOCK': '', + \ 'SWALLOW': '', + \ 'GRADIENT': '', + \ 'GROUP': '', + \ 'BOX': '', + \ 'TABLE': '', + \ } +" part effects +let s:partEffects = { + \ 'NONE': '', + \ 'PLAIN': '', + \ 'OUTLINE': '', + \ 'SOFT_OUTLINE': '', + \ 'SHADOW': '', + \ 'SOFT_SHADOW': '', + \ 'OUTLINE_SHADOW': '', + \ 'OUTLINE_SOFT_SHADOW': '', + \ 'FAR_SHADOW': '', + \ 'FAR_SOFT_SHADOW': '', + \ 'GLOW': '', + \ } +" part ignore flags +let s:partIgnoreFlags = { + \ 'NONE': '', + \ 'ON_HOLD': '', + \ } +" part pointer mode +let s:partPointerMode = { + \ 'AUTOGRAB': '', + \ 'NOGRAB': '', + \ } +" part editable_mode +let s:partEditableMode = { + \ 'NONE': '', + \ 'PLAIN': '', + \ 'EDITABLE': '', + \ 'PASSWORD': '', + \ } + +" aspect_preference types +let s:aspectPrefTypes = { + \ 'VERTICAL': '', + \ 'HORIZONTAL': '', + \ 'BOTH': '', + \ } + +" program transition types +let s:transitionTypes = { + \ 'LINEAR': '0.0 - 1.0', + \ 'SINUSOIDAL': '0.0 - 1.0', + \ 'ACCELERATE': '0.0 - 1.0', + \ 'DECELERATE': '0.0 - 1.0', + \ } +" program action types +let s:actionTypes = { + \ 'STATE_SET': '"string" "0.0 - 1.0"', + \ 'ACTION_STOP': '', + \ 'SIGNAL_EMIT': '"string" "string"', + \ 'DRAG_VAL_SET': '"float" "float"', + \ 'DRAG_VAL_STEP': '"float" "float"', + \ 'DRAG_VAL_PAGE': '"float" "float"', + \ 'FOCUS_SET': '', + \ } +" box item types +let s:boxItemTypes = { + \ 'GROUP': '', + \ } +" box item aspect mode +let s:boxItemAspectMode = { + \ 'NONE': '', + \ 'NEITHER': '', + \ 'VERTICAL': '', + \ 'HORIZONTAL': '', + \ 'BOTH': '', + \ } +" box layout +let s:boxLayout = { + \ '"horizontal"': '', + \ '"horizontal_homogeneous"': '', + \ '"horizontal_max"': '', + \ '"horizontal_flow"': '', + \ '"vertical"': '', + \ '"vertical_homogeneous"': '', + \ '"vertical_max"': '', + \ '"vertical_flow"': '', + \ '"stack"': '', + \ } +" table homogeneous mode +let s:tableHomogeneousMode = { + \ 'NONE': '', + \ 'TABLE': '', + \ 'ITEM': '', + \ } +syntax/embryo.vim [[[1 +195 +" Vim syntax file +" Language: Embryo +" Maintainer: Viktor Kojouharov +" Last Change: 2006 10 06 + +" For version 5.x: Clear all syntax items +" For version 6.x: Quit when a syntax file was already loaded +if version < 600 + syntax clear +elseif exists("b:current_syntax") + finish +endif + +" A bunch of useful keywords +syn keyword embryoConditional if else switch +syn keyword embryoRepeat while for do in +syn keyword embryoBranch break continue +syn keyword embryoOperator new +syn keyword embryoType Float State_Param Msg_Type enum +syn keyword embryoStatement return with native stock forward +syn keyword embryoLabel case default +syn keyword embryoReserved public +syn keyword embryoEdjeKey PART PROGRAM + +syn keyword embryoTodo contained TODO FIXME XXX + +" embryoCommentGroup allows adding matches for special things in comments +syn cluster embryoCommentGroup contains=embryoTodo + +" String and Character constants +" Highlight special characters (those which have a backslash) differently +syn match embryoSpecial display contained "\\\(x\x\+\|\o\{1,3}\|.\|$\)" +syn region embryoString start=+L\="+ skip=+\\\\\|\\"+ end=+"+ contains=embryoSpecial +syn match embryoFormat display "%\(\d\+\$\)\=[-+' #0*]*\(\d*\|\*\|\*\d\+\$\)\(\.\(\d*\|\*\|\*\d\+\$\)\)\=\([hlL]\|ll\)\=\([diuoxXfeEgGcCsSpn]\|\[\^\=.[^]]*\]\)" contained +syn match embryoFormat display "%%" contained +syn region embryoString start=+L\="+ skip=+\\\\\|\\"+ end=+"+ contains=cSpecial,cFormat + +syn match embryoCharacter "L\='[^\\]'" +syn match embryoCharacter "L'[^']*'" contains=embryoSpecial +syn match embryoSpecialError "L\='\\[^'\"?\\abfnrtv]'" +syn match embryoSpecialCharacter "L\='\\['\"?\\abfnrtv]'" +syn match embryoSpecialCharacter display "L\='\\\o\{1,3}'" +syn match embryoSpecialCharacter display "'\\x\x\{1,2}'" +syn match embryoSpecialCharacter display "L'\\x\x\+'" + +"when wanted, highlight trailing white space +if exists("embryo_space_errors") + if !exists("embryo_no_trail_space_error") + syn match embryoSpaceError display excludenl "\s\+$" + endif + if !exists("embryo_no_tab_space_error") + syn match embryoSpaceError display " \+\t"me=e-1 + endif +endif + +"catch errors caused by wrong parenthesis and brackets +syn cluster embryoParenGroup contains=embryoParenError,embryoIncluded,embryoSpecial,embryoCommentSkip,embryoCommentString,embryoComment2String,@embryoCommentGroup,embryoCommentStartErr,embryoUserCont,embryoUserLabel,embryoBitField,embryoCommentSkip,embryoOctalZero,embryoFormat,embryoNumber,embryoFloat,embryoOctal,embryoOctalError,embryoNumbersCom +if exists("embryo_no_bracket_error") + syn region embryoParen transparent start='(' end=')' contains=ALLBUT,@embryoParenGroup + syn match embryoParenError display ")" + syn match embryoErrInParen display contained "[{}]" +else + syn region embryoParen transparent start='(' end=')' contains=ALLBUT,@embryoParenGroup,embryoErrInBracket + syn match embryoParenError display "[\])]" + syn match embryoErrInParen display contained "[\]{}]" + syn region embryoBracket transparent start='\[' end=']' contains=ALLBUT,@embryoParenGroup,embryoErrInParen + syn match embryoErrInBracket display contained "[);{}]" +endif + +syn region embryoBrace start='{' end='}' transparent keepend +"integer number, or floating point number without a dot and with "f". +syn case ignore +syn match embryoNumbers display transparent "\<\d\|\.\d" contains=embryoNumber,embryoFloat,embryoOctalError,embryoOctal +" Same, but without octal error (for comments) +syn match embryoNumbersCom display contained transparent "\<\d\|\.\d" contains=embryoNumber,embryoFloat,embryoOctal +syn match embryoNumber display contained "\d\+\(u\=l\{0,2}\|ll\=u\)\>" +"hex number +syn match embryoNumber display contained "0x\x\+\(u\=l\{0,2}\|ll\=u\)\>" +" Flag the first zero of an octal number as something special +syn match embryoOctal display contained "0\o\+\(u\=l\{0,2}\|ll\=u\)\>" contains=embryoOctalZero +syn match embryoOctalZero display contained "\<0" +syn match embryoFloat display contained "\d\+f" +"floating point number, with dot, optional exponent +syn match embryoFloat display contained "\d\+\.\d*\(e[-+]\=\d\+\)\=[fl]\=" +"floating point number, starting with a dot, optional exponent +syn match embryoFloat display contained "\.\d\+\(e[-+]\=\d\+\)\=[fl]\=\>" +"floating point number, without dot, with exponent +syn match embryoFloat display contained "\d\+e[-+]\=\d\+[fl]\=\>" +" flag an octal number with wrong digits +syn match embryoOctalError display contained "0\o*[89]\d*" +syn case match + +if exists("embryo_comment_strings") + " A comment can contain embryoString, embryoCharacter and embryoNumber. + " But a "*/" inside a embryoString in a embryoComment DOES end the comment! So we + " need to use a special type of embryoString: embryoCommentString, which also ends + " on "*/", and sees a "*" at the start of the line as comment again. + " Unfortunately this doesn't very well work for // type of comments :-( + syntax match embryoCommentSkip contained "^\s*\*\($\|\s\+\)" + syntax region embryoCommentString contained start=+L\=\\\@" skip="\\$" end="$" end="//"me=s-1 contains=embryoComment,embryoCharacter,embryoParenError,embryoNumbers,embryoCommentError,embryoSpaceError +syn match embryoPreCondit display "^\s*#\s*\(else\|endif\)\>" +syn region embryoIncluded display contained start=+"+ skip=+\\\\\|\\"+ end=+"+ +syn match embryoIncluded display contained "<[^>]*>" +syn match embryoInclude display "^\s*#\s*include\>\s*["<]" contains=embryoIncluded +syn cluster embryoPreProcGroup contains=embryoPreCondit,embryoIncluded,embryoInclude,embryoDefine,embryoErrInParen,embryoErrInBracket,embryoCommentSkip,embryoCommentString,embryoComment2String,@embryoCommentGroup,embryoCommentStartErr,embryoParen,embryoBracket,embryoMulti,embryoUserLabel +syn cluster embryoAlphaNum contains=embryoSpecial,embryoOctalZero,embryoFormat,embryoNumber,embryoFloat,embryoOctal,embryoOctalError,embryoNumbersCom,embryoString +syn region embryoDefine start="^\s*#\s*\(define\|undef\)\>" skip="\\$" end="$" end="//"me=s-1 contains=ALLBUT,@embryoPreProcGroup +syn region embryoPreProc start="^\s*#\s*\(pragma\>\|line\>\|warning\>\|warn\>\|error\>\)" skip="\\$" end="$" keepend contains=ALLBUT,@embryoPreProcGroup + +syn match embryoUserLabel display "\I\i*" contained + +syn match embryoFunctionName "\h\w*\s*\%((\@=\)" + +if exists("embryo_minlines") + let b:embryo_minlines = embryo_minlines +else + let b:embryo_minlines = 50 " #if 0 constructs can be long +endif +exec "syn sync ccomment embryoComment minlines=" . b:embryo_minlines +"syn sync fromstart + +" Define the default highlighting. +" For version 5.7 and earlier: only when not done already +" For version 5.8 and later: only when an item doesn't have highlighting yet +if version >= 508 || !exists("did_embryo_syn_inits") + if version < 508 + let did_embryo_syn_inits = 1 + command -nargs=+ HiLink hi link + else + command -nargs=+ HiLink hi def link + endif + + HiLink embryoFormat embryoSpecial + HiLink embryoCommentL embryoComment + HiLink embryoCommentStart embryoComment + HiLink embryoLabel Label + HiLink embryoUserLabel Label + HiLink embryoConditional Conditional + HiLink embryoRepeat Repeat + HiLink embryoBranch Conditional + HiLink embryoReserved Keyword + HiLink embryoCharacter Character + HiLink embryoSpecialCharacter cSpecial + HiLink embryoNumber Number + HiLink embryoOctal Number + HiLink embryoOctalZero PreProc " link this to Error if you want + HiLink embryoFloat Float + HiLink embryoOctalError embryoError + HiLink embryoParenError embryoError + HiLink embryoErrInParen embryoError + HiLink embryoErrInBracket embryoError + HiLink embryoCommentError embryoError + HiLink embryoCommentStartErr embryoError + HiLink embryoSpaceError embryoError + HiLink embryoSpecialError embryoError + HiLink embryoOperator Operator + HiLink embryoStructure Structure + HiLink embryoEdjeKey Structure + HiLink embryoStorageClass StorageClass + HiLink embryoInclude Include + HiLink embryoPreProc PreProc + HiLink embryoDefine Macro + HiLink embryoIncluded embryoString + HiLink embryoError Error + HiLink embryoStatement Statement + HiLink embryoPreCondit PreCondit + HiLink embryoType Type + HiLink embryoConstant Constant + HiLink embryoCommentString embryoString + HiLink embryoComment2String embryoString + HiLink embryoCommentSkip embryoComment + HiLink embryoString String + HiLink embryoComment Comment + HiLink embryoSpecial SpecialChar + HiLink embryoTodo Todo + HiLink embryoFunctionName Function + + delcommand HiLink +endif + +let b:current_syntax = "embryo" + +" vim: ts=8 -- 2.7.4