Add syntax files for EDC format.

This commit is contained in:
Daniel Zaoui 2014-07-29 03:42:04 +03:00
parent c25369f5c5
commit 97f35f5c0a
5 changed files with 1237 additions and 0 deletions

892
autoload/edccomplete.vim Normal file
View File

@ -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': '',
\ }

3
ftdetect/edc.vim Normal file
View File

@ -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

24
ftplugin/edc.vim Normal file
View File

@ -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

83
indent/edc.vim Normal file
View File

@ -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

235
syntax/edc.vim Normal file
View File

@ -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