113 lines
4.3 KiB
VimL
113 lines
4.3 KiB
VimL
if exists( "g:__AL_XPT_ST_VIM__" ) && g:__AL_XPT_ST_VIM__ >= XPT#ver
|
|
finish
|
|
endif
|
|
let g:__AL_XPT_ST_VIM__ = XPT#ver
|
|
let s:oldcpo = &cpo
|
|
set cpo-=< cpo+=B
|
|
let s:log = xpt#debug#Logger( 'warn' )
|
|
exe XPT#importConst
|
|
let s:proto = { 'hidden':0, 'variables':{}, 'preValues':{}, 'onfocusFilters':{}, 'mappings':{}, 'liveFilters':{}, 'postFilters':{}, 'replacements':{}, 'postQuoter':{}, 'comeFirst':[], 'comeLast':[], }
|
|
let s:protoDefault = { 'preValues':{ 'cursor' : xpt#flt#New( 0, '$CURSOR_PH' ) }, 'onfocusFilters':{ 'cursor' : xpt#flt#New( 0, 'FinishPH({"text":""})' ) }, 'postQuoter':{ 'start' : '{{', 'end' : '}}' }, }
|
|
fun! xpt#st#New()
|
|
return deepcopy(s:proto)
|
|
endfunction
|
|
fun! xpt#st#Extend(setting)
|
|
for k in [ 'preValues', 'onfocusFilters', 'liveFilters', 'postFilters' ]
|
|
if has_key(a:setting,k)
|
|
for val in values(a:setting[k])
|
|
call xpt#flt#Extend(val)
|
|
endfor
|
|
endif
|
|
endfor
|
|
if has_key( a:setting, 'mappings' )
|
|
for phMapping in values(a:setting.mappings)
|
|
for mapFilter in values(phMapping.keys)
|
|
call xpt#flt#Extend(mapFilter)
|
|
endfor
|
|
endfor
|
|
endif
|
|
call extend( a:setting, deepcopy( s:proto ), 'keep' )
|
|
for [k,v] in items(s:protoDefault)
|
|
call extend( a:setting[ k ], deepcopy( v ), 'keep' )
|
|
endfor
|
|
endfunction
|
|
fun! xpt#st#RenderPhaseCopy(setting)
|
|
let setting = copy(a:setting)
|
|
for k in [ 'variables', 'preValues', 'onfocusFilters' , 'liveFilters', 'postFilters', 'comeFirst', 'comeLast' ]
|
|
let setting[k] = copy(setting[k])
|
|
endfor
|
|
let x = b:xptemplateData
|
|
if x.currentExt != {}
|
|
let setting.variables[ '$EXT' ] = x.currentExt.ext
|
|
let x.currentExt = {}
|
|
endif
|
|
return setting
|
|
endfunction
|
|
fun! xpt#st#What()
|
|
endfunction
|
|
fun! xpt#st#Simplify(setting)
|
|
call filter( a:setting, '!has_key(s:proto,v:key) || v:val!=s:proto[v:key]' )
|
|
endfunction
|
|
fun! xpt#st#Merge(setting,fromSettings)
|
|
let a:setting.comeFirst += a:fromSettings.comeFirst
|
|
let a:setting.comeLast = a:fromSettings.comeLast + a:setting.comeLast
|
|
call xpt#st#InitItemOrderList(a:setting)
|
|
call extend( a:setting.preValues, a:fromSettings.preValues, 'keep' )
|
|
call extend( a:setting.onfocusFilters, a:fromSettings.onfocusFilters, 'keep' )
|
|
call extend( a:setting.postFilters, a:fromSettings.postFilters, 'keep' )
|
|
call extend( a:setting.variables, a:fromSettings.variables, 'keep' )
|
|
for key in keys(a:fromSettings.mappings)
|
|
if !has_key(a:setting.mappings,key)
|
|
let a:setting.mappings[key] = { 'saver' : xpt#msvr#New( 1 ), 'keys' : {} }
|
|
endif
|
|
for keystroke in keys(a:fromSettings.mappings[key].keys)
|
|
let a:setting.mappings[key].keys[keystroke] = a:fromSettings.mappings[key].keys[keystroke]
|
|
call xpt#msvr#Add( a:setting.mappings[ key ].saver, 'i', keystroke )
|
|
endfor
|
|
endfor
|
|
endfunction
|
|
fun! xpt#st#Parse(setting,snipObject)
|
|
let st = a:setting
|
|
if get( st, 'wraponly' ) isnot 0
|
|
call extend( st, { 'iswrap' : 1, 'iswraponly' : 1, 'wrapPH' : st.wraponly }, 'force' )
|
|
elseif get( st, 'wrap' ) isnot 0
|
|
call extend( st, { 'iswrap' : 1, 'iswraponly' : 0, 'wrapPH' : st.wrap }, 'force' )
|
|
else
|
|
call extend( st, { 'iswrap' : 0, 'iswraponly' : 0 }, 'force' )
|
|
endif
|
|
if st.iswrap && st.wrapPH is 1
|
|
let st.wrapPH = 'cursor'
|
|
endif
|
|
if has_key(st, 'rawHint')
|
|
if st.rawHint =~ s:regEval
|
|
let x = b:xptemplateData
|
|
let x.renderContext.snipObject = a:snipObject
|
|
let st.hint = xpt#eval#Eval(st.rawHint, x.filetypes[x.snipFileScope.filetype].funcs, { 'variables' : st.variables } )
|
|
else
|
|
let st.hint = xpt#util#UnescapeChar(st.rawHint,s:nonsafe)
|
|
endif
|
|
endif
|
|
call xpt#st#ParsePostQuoter(st)
|
|
if has_key( st, 'extension' )
|
|
let ext = st.extension
|
|
let a:snipObject.ftScope.extensionTable[ext] = get(a:snipObject.ftScope.extensionTable,ext,[])
|
|
let a:snipObject.ftScope.extensionTable[ext] += [a:snipObject.name]
|
|
endif
|
|
endfunction
|
|
fun! xpt#st#ParsePostQuoter(setting)
|
|
if !has_key( a:setting, 'postQuoter' ) || type(a:setting.postQuoter) == type({})
|
|
return
|
|
endif
|
|
let quoters = split( a:setting.postQuoter, ',' )
|
|
if len(quoters) < 2
|
|
throw 'postQuoter must be separated with ","! :' . a:setting.postQuoter
|
|
endif
|
|
let a:setting.postQuoter = { 'start' : quoters[0], 'end' : quoters[1] }
|
|
endfunction
|
|
fun! xpt#st#InitItemOrderList(setting)
|
|
call filter( a:setting.comeLast, 'v:val!="cursor"' )
|
|
call add( a:setting.comeLast, 'cursor' )
|
|
let a:setting.comeFirst = xpt#util#RemoveDuplicate(a:setting.comeFirst)
|
|
let a:setting.comeLast = xpt#util#RemoveDuplicate(a:setting.comeLast)
|
|
endfunction
|
|
let &cpo = s:oldcpo
|