dot_files/vim-plugins/bundle/xptemplate/ftplugin/_common/common.bracketcmpl.xpt.vim
2017-07-09 00:26:06 +03:00

187 lines
3.7 KiB
VimL

XPTemplate priority=all
let s:f = g:XPTfuncs()
XPTinclude
\ _common/common
let s:pairs = { 'left' : "'" . '"([{<|*`+ ',
\ 'right': "'" . '")]}>|*`+ ', }
" TODO not perfect: hide right part if found right is already in input area.
" use searchpair() to improve
let s:crIndent = 0
fun! s:f.BracketRightPart( leftReg )
if has_key( self._ctx.renderContext, 'bracketComplete' )
return ''
endif
let v = self.V()
let v0 = v
let v = matchstr( v, a:leftReg )
if v == ''
return ''
endif
let v = join( reverse( split( v, '\V\s\{-}' ) ), '')
let v = tr( v, s:pairs.left, s:pairs.right )
if v0 =~ '\V\n\s\*\$'
let v = matchstr( v, '\V\S\+' )
return { "action" : "text", "nIndent" : -s:crIndent, "text" : "\n".v }
else
return v
endif
endfunction
fun! s:f.bkt_cmpl()
return self.BracketRightPart( self._ctx.renderContext.leftReg )
endfunction
fun! s:f.quote_cmpl()
let r = self._ctx.renderContext
let v = self.V()
let v = matchstr( v, r.leftReg )
if has_key( r, 'bracketComplete' )
return ''
elseif v == ''
return ''
else
return r.charRight
endif
endfunction
fun! s:f.quote_ontype()
let v = self.V()
if v == ''
return self.Finish()
elseif v =~ '\V\n'
return self.FinishOuter( v )
else
return 0
endif
endfunction
fun! s:f.bkt_ontype()
let v = self.V()
if v == ''
return self.Finish()
elseif v =~ '\V\n\s\*\$'
if &indentexpr != ''
let indentexpr = substitute( &indentexpr, '\Vv:lnum', 'line(".")', '' )
try
let nNewLineIndent = eval( indentexpr )
let s:crIndent = nNewLineIndent - indent( line( "." ) - 1 )
catch /.*/
let s:crIndent = self.NIndent()
endtry
else
let s:crIndent = self.NIndent()
endif
" create snippet indent. filter does not use actual indent string
let n_indent = xpt#indent#ActualToSnippetNr(s:crIndent)
let indent_str = repeat( ' ', n_indent )
let v = substitute( v, '\V\s\*\n\.\*', "\n", 'g' )
return self.FinishOuter( v . indent_str )
else
" nothing todo
return 0
endif
endfunction
fun! s:f.bkt_init( followingChar )
let r = self._ctx.renderContext
let r.char = self.GetVar( '$_xSnipName' )
let r.followingChar = a:followingChar
let r.leftReg = '\V\^' . r.char . r.followingChar . '\?'
let i = stridx( s:pairs.left, r.char )
if i != -1
let r.charRight = s:pairs.right[ i ]
call XPTmapKey( r.charRight, 'bkt_finish(' . string( r.charRight ) . ')' )
else
let r.charRight = ''
endif
return ''
endfunction
fun! s:f.bkt_finish( keyPressed )
let r = self._ctx.renderContext
if a:keyPressed != r.charRight
" may be outer snippet key bind
return a:keyPressed
endif
let r.bracketComplete = 1
let v = self.V()
if self.GetVar( '$SParg' ) == ' '
if v == r.char . r.followingChar
return self.FinishOuter( r.char . r.charRight )
else
return self.FinishOuter( v . r.charRight )
endif
else
return self.FinishOuter( v . r.charRight )
endif
endfunction
XPT _bracket hidden
XSET s|pre=Echo('')
XSET s|ontype=bkt_ontype()
XSET s=bkt_init(' ')
`$_xSnipName$SParg`s^`s^bkt_cmpl()^
XPT _quote hidden
XSET s|pre=Echo('')
XSET s|ontype=quote_ontype()
XSET s=bkt_init('')
`$_xSnipName`s^`s^quote_cmpl()^
XPT ( hidden alias=_bracket
XPT [ hidden alias=_bracket
XPT { hidden alias=_bracket
XPT < hidden alias=_bracket
XPT ' hidden alias=_quote
XPT " hidden alias=_quote