jackdanielz pushed a commit to branch master. http://git.enlightenment.org/editors/vim-configs.git/commit/?id=97f35f5c0adca4055eb06080d7bb310123857f12
commit 97f35f5c0adca4055eb06080d7bb310123857f12 Author: Daniel Zaoui <[email protected]> Date: Tue Jul 29 03:42:04 2014 +0300 Add syntax files for EDC format. --- autoload/edccomplete.vim | 892 +++++++++++++++++++++++++++++++++++++++++++++++ ftdetect/edc.vim | 3 + ftplugin/edc.vim | 24 ++ indent/edc.vim | 83 +++++ syntax/edc.vim | 235 +++++++++++++ 5 files changed, 1237 insertions(+) diff --git a/autoload/edccomplete.vim b/autoload/edccomplete.vim new file mode 100644 index 0000000..e2521e9 --- /dev/null +++ b/autoload/edccomplete.vim @@ -0,0 +1,892 @@ +" 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 =~ 'select_mode:\s*' + call edccomplete#AddKeyword(res, a:base, s:partSelectMode) + 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 == 'map' + call edccomplete#AddLabel(res, line, a:base, s:mapLabel) + call edccomplete#AddStatement(res, line, a:base, s:mapStatement) + + elseif b:scontext == 'rotation' + call edccomplete#AddLabel(res, line, a:base, s:rotationLabel) + + elseif b:scontext == 'perspective' + call edccomplete#AddLabel(res, line, a:base, s:perspectiveLabel) + + elseif b:scontext == 'params' + call edccomplete#AddLabel(res, line, a:base, s:paramsLabel) + + elseif b:scontext == 'image' + call edccomplete#AddLabel(res, line, a:base, s:imageLabel) + if line =~ 'image:\s*".\{-}"' + call edccomplete#AddKeyword(res, a:base, s:imageStorageMethod) + elseif line =~ 'middle:\s*' + call edccomplete#AddKeyword(res, a:base, s:imageMiddleTypes) + elseif line =~ 'scale_hint:\s*' + call edccomplete#AddKeyword(res, a:base, s:imageScaleHint) + endif + + elseif b:scontext == 'fill' + call edccomplete#AddLabel(res, line, a:base, s:fillLabel) + call edccomplete#AddStatement(res, line, a:base, s:fillStatement) + if line =~ 'type:\s*' + call edccomplete#AddKeyword(res, a:base, s:fillTypes) + endif + + 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) + if line =~ 'type:\s*' + call edccomplete#AddKeyword(res, a:base, s:gradientTypes) + endif + + 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 b:scontext == 'externals' + call edccomplete#AddLabel(res, line, a:base, s:externalsLabel) + + 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}]*\<part\>[ \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}]*\<parts\>[ \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': '"name"', + \ 'type': 'keyword', + \ 'effect': 'keyword', + \ 'clip_to': '"part_name"', + \ 'scale': '0-1', + \ 'mouse_events': '0-1', + \ 'repeat_events': '0-1', + \ 'ignore_flags': 'keyword ...', + \ 'pointer_mode': 'keyword', + \ 'select_mode': 'keyword', + \ 'precise_is_inside': '0-1', + \ 'use_alternate_font_metrics': '0-1', + \ 'image': '"filename" keyword', + \ 'font': '"filename" "name"', + \ 'entry_mode': 'keyword', + \ 'multiline': '0-1 (TEXTBLOCK only)', + \ 'source': '"group_name" (GROUP or TEXTBLOCK only)', + \ 'source2': '"group_name" (TEXTBLOCK only)', + \ 'source3': '"group_name" (TEXTBLOCK only)', + \ 'source4': '"group_name" (TEXTBLOCK only)', + \ 'source5': '"group_name" (TEXTBLOCK only)', + \ 'source6': '"group_name" (TEXTBLOCK only)', + \ } +let s:partStatement = [ + \ 'dragable', + \ 'images', + \ 'fonts', + \ 'description', + \ 'styles', + \ 'color_classes', + \ 'program', + \ 'programs', + \ 'box', + \ ] + +" dragable +let s:dragableLabel = { + \ 'x': '0-1 int int', + \ 'y': '0-1 int int', + \ 'confine': '"part_name"', + \ 'events': '"draggable_part_name"', + \ } + +" description +let s:descriptionLabel = { + \ 'state': '"name" index (float)', + \ 'inherit': '"description" index (float)', + \ 'visible': '0-1', + \ 'align': 'x y (float)', + \ 'fixed': 'width height (0-1)', + \ 'min': 'width height (int)', + \ 'max': 'width height (int)', + \ 'step': 'width height (int)', + \ 'aspect': 'min max (float)', + \ 'aspect_preference': 'keyword', + \ 'color_class': '"name"', + \ 'color': '0-255 0-255 0-255 0-255', + \ 'color2': '0-255 0-255 0-255 0-255', + \ 'color3': '0-255 0-255 0-255 0-255', + \ 'font': '"filename" "name"', + \ } +let s:descriptionStatement = [ + \ 'rel1', + \ 'rel2', + \ 'image', + \ 'fill', + \ 'text', + \ 'gradient', + \ 'images', + \ 'fonts', + \ 'styles', + \ 'color_classes', + \ 'program', + \ 'programs', + \ 'box', + \ 'map', + \ ] + +" rel +let s:relLabel = { + \ 'relative': 'x y (float)', + \ 'offset': 'x y (int)', + \ 'to': '"part_name"', + \ 'to_x': '"part_name"', + \ 'to_y': '"part_name"', + \ } +" map +let s:mapLabel = { + \ 'on': '0-1', + \ 'perspective': '"part_name"', + \ 'light': '"part_name"', + \ 'smooth': '0-1', + \ 'pespective_on':'0-1', + \ 'backface_cull':'0-1', + \ 'alpha': '0-1', + \ } +let s:mapStatement = [ + \ 'rotation', + \ ] + +let s:rotationLabel = { + \ 'center': '"part_name"', + \ 'x': '"degrees (float)"', + \ 'y': '"degrees (float)"', + \ 'z': '"degrees (float)"', + \ } + +" params +let s:paramsLabel = { + \ 'int': '"name" int', + \ 'double': '"name" double', + \ 'string': '"name" "string"', + \ } + +" perspective +let s:perspectiveLabel = { + \ 'zplane': 'int', + \ 'focal': 'int', + \ } + + +" image +let s:imageLabel = { + \ 'image': '"filename" keyword', + \ 'normal': '"filename"', + \ 'tween': '"filename"', + \ 'border': 'left right top bottom (int)', + \ 'middle': 'keyword', + \ 'border_scale': '0-1', + \ 'scale_hint': 'keyword', + \ } + +" fill +let s:fillLabel = { + \ 'smooth': '0-1', + \ 'angle': '0-360 (GRADIENT)', + \ 'spread': '0-1', + \ 'type': 'keyword', + \ } +let s:fillStatement = [ + \ 'origin', + \ 'size', + \ ] +" fill origin/size +let s:fillInnerStatement = { + \ 'relative': 'width height (float)', + \ 'offset': 'x y (int)', + \ } +" fill types +let s:fillTypes = { + \ 'SCALE': '', + \ 'TILE': '', + \ } + +" text +let s:textLabel = { + \ 'text': '"string"', + \ 'font': '"font_name"', + \ 'size': 'size (int)', + \ 'text_class': '"class_name"', + \ 'fit': 'x y (0-1)', + \ 'min': 'x y (0-1)', + \ 'max': 'x y (0-1)', + \ 'align': 'x y (float)', + \ 'source': '"part_name"', + \ 'text_source': '"text_part_name"', + \ 'style': '"style_name"', + \ 'elipsis': '0.0-1.0', + \ 'repch': '"string" (PASSWORD mode)', + \ } +let s:textStatement = [ + \ 'fonts', + \ ] + +" program +let s:programLabel = { + \ 'name': '"name"', + \ 'signal': '"signal_name"', + \ 'source': '"part_name"', + \ 'action': 'keyword ...', + \ 'transition': 'keyword time (float)', + \ 'filter': '"part_name" "state_name"', + \ 'in': 'from range (float)', + \ 'target': '"part_name"', + \ 'after': '"program_name"', + \ } +let s:programStatement = [ + \ 'script', + \ 'lua_script', + \ ] + + +" programs +let s:programsLabel = { + \ 'image': '"filename" keyword', + \ 'font': '"filename" "name"', + \ } +let s:programsStatement = [ + \ 'images', + \ 'fonts', + \ 'program', + \ ] + +" box and table +let s:boxStatement = [ + \ 'items', + \ ] +let s:boxItemsStatement = [ + \ 'item', + \ ] +let s:boxItemLabel = { + \ 'type': 'keyword', + \ 'name': '"name"', + \ 'source': '"group_name"', + \ 'min': 'width height (int)', + \ 'prefer': 'width height (int)', + \ 'max': 'width height (int)', + \ 'padding': 'left right top bottom (int)', + \ 'align': 'x y (float)', + \ 'weight': 'x y (float)', + \ 'aspect': 'w h (float)', + \ 'aspect_mode': 'keyword', + \ 'options': '"extra options"', + \ } +let s:boxDescLabel = { + \ 'layout': '"string" ["string"]', + \ 'align': 'float float', + \ 'padding': 'int int', + \ } +let s:tableItemLabel = { + \ 'position': 'col row (int)', + \ 'span': 'col row (int)', + \ } +let s:tableDescLabel = { + \ 'homogeneous': 'keyword', + \ 'align': 'float float', + \ 'padding': 'int int', + \ } + +" group +let s:groupLabel = { + \ 'name': '"name"', + \ 'alias': '"alias"', + \ 'min': 'width height', + \ 'max': 'width height', + \ 'image': '"filename" keyword', + \ 'font': '"filename" "name"', + \ 'script_only': '0-1', + \ } +let s:groupStatement = [ + \ 'data', + \ 'script', + \ 'lua_script', + \ 'parts', + \ 'images', + \ 'fonts', + \ 'styles', + \ 'color_classes', + \ 'program', + \ 'programs', + \ 'externals', + \ ] + +" parts +let s:partsStatement = [ + \ 'images', + \ 'fonts', + \ 'part', + \ 'styles', + \ 'color_classes', + \ 'program', + \ 'programs', + \ ] +let s:partsLabel = { + \ 'image': '"filename" keyword', + \ 'font': '"filename" "name"', + \ } + +" data +let s:dataLabel = { + \ 'item': '"key" "value"', + \ 'file': '"key" "filename"', + \ } + +" fonts +let s:fontsLabel = { + \ 'font': '"filename" "name"', + \ } + +"images +let s:imagesLabel = { + \ 'image': '"filename" keyword', + \ } + +"collections +let s:collectionsStatement = [ + \ 'group', + \ 'images', + \ 'fonts', + \ 'styles', + \ 'color_classes', + \ 'externals', + \ ] +let s:collectionsLabel = { + \ 'image': '"filename" keyword', + \ 'font': '"filename" "name"', + \ } + +" externals +let s:externalsLabel = { + \ 'external': '"name"', + \ } + +" spectra +let s:spectraStatement = [ + \ 'spectrum', + \ ] +" spectrum +let s:spectrumLabel = { + \ 'name': '"name"', + \ 'color': '0-255 0-255 0-255 0-255', + \ } +" gradient +let s:gradientLabel = { + \ 'type': '"keyword"', + \ 'spectrum': '"spectrum_name"', + \ } +let s:gradientStatement = [ + \ 'rel1', + \ 'rel2', + \ ] +" gradient types +let s:gradientTypes = { + \ '"linear"': '', + \ '"radial"': '', + \ '"rectangular"': '', + \ '"angular"': '', + \ '"sinusoidal"': '', + \ } + +" styles +let s:stylesStatement = [ + \ 'style', + \ ] +" style +let s:styleLabel = { + \ 'name': '"name"', + \ 'base': '".. default style properties .."', + \ 'tag': '"tagname" "style properties"', + \ } + +" color_classes +let s:color_classesStatement = [ + \ 'color_class', + \ ] +" color_class +let s:color_classLabel = { + \ 'name': '"name"', + \ 'color': '0-255 0-255 0-255 0-255', + \ 'color2': '0-255 0-255 0-255 0-255', + \ 'color3': '0-255 0-255 0-255 0-255', + \ } + +" toplevel +let s:topStatement = [ + \ 'fonts', + \ 'images', + \ 'data', + \ 'collections', + \ 'spectra', + \ 'styles', + \ 'color_classes', + \ 'externals', + \ ] + +" images image storage method +let s:imageStorageMethod = { + \ 'COMP': '', + \ 'RAW': '', + \ 'USER': '', + \ 'LOSSY': '0-100', + \ } +" image middle types +let s:imageMiddleTypes = { + \ '0': '', + \ '1': '', + \ 'NONE': '', + \ 'DEFAULT': '', + \ 'SOLID': '', + \ } +" image scale hint +let s:imageScaleHint = { + \ '0': '', + \ 'NONE': '', + \ 'DYNAMIC': '', + \ 'STATIC': '', + \ } + +" part types +let s:partTypes = { + \ 'TEXT': '', + \ 'IMAGE': '', + \ 'RECT': '', + \ 'TEXTBLOCK': '', + \ 'SWALLOW': '', + \ 'GRADIENT': '', + \ 'GROUP': '', + \ 'BOX': '', + \ 'TABLE': '', + \ 'EXTERNAL': '', + \ } +" 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 select_mode +let s:partSelectMode = { + \ 'DEFAULT': '', + \ 'EXPLICIT': '', + \ } +" 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': '', + \ } diff --git a/ftdetect/edc.vim b/ftdetect/edc.vim new file mode 100644 index 0000000..d8cc228 --- /dev/null +++ b/ftdetect/edc.vim @@ -0,0 +1,3 @@ +au BufRead,BufNewFile *.edc set filetype=edc +au BufRead,BufNewFile *.sma set filetype=embryo +au BufRead,BufNewFile *.embryo set filetype=embryo diff --git a/ftplugin/edc.vim b/ftplugin/edc.vim new file mode 100644 index 0000000..be4530b --- /dev/null +++ b/ftplugin/edc.vim @@ -0,0 +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 + diff --git a/indent/edc.vim b/indent/edc.vim new file mode 100644 index 0000000..498be4a --- /dev/null +++ b/indent/edc.vim @@ -0,0 +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 diff --git a/syntax/edc.vim b/syntax/edc.vim new file mode 100644 index 0000000..58cd0b0 --- /dev/null +++ b/syntax/edc.vim @@ -0,0 +1,235 @@ +" 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 file params externals contained +syn keyword edcBlock map rotation perspective script lua_script 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 z 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 border_scale scale_hint color color2 color3 font size contained +syn keyword edcLabel signal action transition in filter 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 edcLabel on perspective light perspective_on contained +syn keyword edcLabel backface_cull alpha center focus zplane contained +syn keyword edcLabel int double string external script_only 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=edcSpecial,edcCommentSkip + syntax region edcComment2String contained start=+L\=\\\@<!"+ skip=+\\\\\|\\"+ end=+"+ end="$" contains=edcSpecial + syntax region edcCommentL start="//" skip="\\$" end="$" keepend contains=@edcCommentGroup,edcComment2String,edcCharacter,edcNumbersCom,edcSpaceError + syntax region edcComment matchgroup=edcCommentStart start="/\*" matchgroup=NONE end="\*/" contains=@edcCommentGroup,edcCommentStartError,edcCommentString,edcCharacter,edcNumbersCom,edcSpaceError +else + syn region edcCommentL start="//" skip="\\$" end="$" keepend contains=@edcCommentGroup,edcSpaceError + syn region edcComment matchgroup=edcCommentStart start="/\*" matchgroup=NONE end="\*/" contains=@edcCommentGroup,edcCommentStartError,edcSpaceError +endif +" keep a // comment separately, it terminates a preproc. conditional +syntax match edcCommentError display "\*/" +syntax match edcCommentStartError display "/\*"me=e-1 contained + +syn region edcPreCondit start="^\s*#\s*\(if\|ifdef\|ifndef\|elif\)\>" 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="\<script\_s*{" end="}" contains=@edcEmbryo,edcScriptTag +syn keyword edcScriptTag contained script + +syn include @edcLua syntax/lua.vim +unlet b:current_syntax +syn region edcLuaScript matchgroup=edcLuaScriptTag start="\<lua_script\_s*{" end="}" contains=@edcLua,edcLuaScriptTag +syn keyword edcLuaScriptTag contained script + +if exists("edc_minlines") + let b:edc_minlines = edc_minlines +else + let b:edc_minlines = 50 " #if 0 constructs can be long +endif +exec "syn sync ccomment edcComment minlines=" . b:edc_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_edc_syn_inits") + if version < 508 + let did_edc_syn_inits = 1 + command -nargs=+ HiLink hi link <args> + else + command -nargs=+ HiLink hi def link <args> + 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 edcLuaScriptTag 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 --
