dot_files/vim-plugins/bundle/xptemplate/ftplugin/_printf/c.like.xpt.vim
2017-07-09 00:26:06 +03:00

105 lines
2.1 KiB
VimL

XPTemplate priorit=like
let s:f = g:XPTfuncs()
XPTvar $TRUE 1
XPTvar $FALSE 0
XPTvar $NULL NULL
XPTvar $UNDEFINED NULL
" a ** = ** a ** + ** 1
" (a, ** b, ** )
XPTvar $SPop ' '
" if () ** {
" else ** {
XPTvar $BRif ' '
" } ** else {
XPTvar $BRel \n
" for () ** {
" while () ** {
" do ** {
XPTvar $BRloop ' '
" struct name ** {
XPTvar $BRstc ' '
" int fun() ** {
" class name ** {
XPTvar $BRfun ' '
XPTinclude
\ _common/common
let s:printfElts = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'
" %[flags][width][.precision][length]specifier
let s:printfItemPattern = '\V\C' . '%' . '\[+\- 0#]\*' . '\%(*\|\d\+\)\?' . '\(.*\|.\d\+\)\?' . '\[hlL]\?' . '\(\[cdieEfgGosuxXpn]\)'
let s:printfSpecifierMap = {
\'c' : 'char',
\'d' : 'int',
\'i' : 'int',
\'e' : 'scientific',
\'E' : 'scientific',
\'f' : 'float',
\'g' : 'float',
\'G' : 'float',
\'o' : 'octal',
\'s' : 'str',
\'u' : 'unsigned',
\'x' : 'decimal',
\'X' : 'Decimal',
\'p' : 'pointer',
\'n' : 'numWritten',
\}
fun! s:f.c_printf_elts( v, sep )
" remove '%%' representing a single '%'
let v = substitute( a:v, '\V%%', '', 'g' )
let [ ml, mr ] = XPTmark()
if v =~ '\V%'
let start = 0
let post = ''
let i = -1
while 1
let i += 1
let start = match( v, s:printfItemPattern, start )
if start < 0
break
endif
let eltList = matchlist( v, s:printfItemPattern, start )
if eltList[1] == '.*'
" need to specifying string length before string pointer
let post .= a:sep . self.GetVar( '$SPop' ) . ml . s:printfElts[ i ] . '_len' . mr
endif
let post .= a:sep . self.GetVar( '$SPop' ) . ml . s:printfElts[ i ] . '_' . s:printfSpecifierMap[ eltList[2] ] . mr
let start += len( eltList[0] )
endwhile
return post
else
return self.Next( '' )
endif
endfunction