diff options
author | mattn <mattn.jp@gmail.com> | 2011-10-28 10:49:43 +0900 |
---|---|---|
committer | mattn <mattn.jp@gmail.com> | 2011-10-28 10:49:43 +0900 |
commit | 89570a0c24203344bc5e15aca6a335e2bc0bf7ee (patch) | |
tree | f3654ef53d605e2d4d54866479ecb0c6efdbfbb9 /autoload | |
parent | b0a78235099adb8ca9fe0b0def31cafedf99cb14 (diff) | |
download | vim-sonictemplate-89570a0c24203344bc5e15aca6a335e2bc0bf7ee.tar.gz vim-sonictemplate-89570a0c24203344bc5e15aca6a335e2bc0bf7ee.tar.bz2 vim-sonictemplate-89570a0c24203344bc5e15aca6a335e2bc0bf7ee.zip |
autoload.
Diffstat (limited to 'autoload')
-rw-r--r-- | autoload/template.vim | 102 |
1 files changed, 102 insertions, 0 deletions
diff --git a/autoload/template.vim b/autoload/template.vim new file mode 100644 index 0000000..b2ac19f --- /dev/null +++ b/autoload/template.vim @@ -0,0 +1,102 @@ +"============================================================================= +" template.vim +" Author: Yasuhiro Matsumoto <mattn.jp@gmail.com> +" Last Change: 28-Oct-2011. + +let s:save_cpo = &cpo +set cpo&vim + +if exists('g:template_vim_template_dir') + let s:tmpldir = g:template_vim_template_dir +else + let s:tmpldir = expand('<sfile>:p:h:h') . '/template/' +endif + +function! template#select() abort + let name = input(':Template ', '', 'customlist,template#complete') + if name == '' + return + endif + call template#apply(name) +endfunction + +function! template#complete(lead, cmdline, curpos) abort + if search('[^ \t]', 'wn') + return map(split(globpath(join([s:tmpldir, &ft], '/'), 'snip-' . a:lead . '*.*'), "\n"), 'fnamemodify(v:val, ":t:r")[5:]') + else + return map(split(globpath(join([s:tmpldir, &ft], '/'), 'base-' . a:lead . '*.*'), "\n"), 'fnamemodify(v:val, ":t:r")[5:]') + endif +endfunction + +function! template#apply(name) abort + let buffer_is_not_empty = search('[^ \t]', 'wn') + if search('[^ \t]', 'wn') + let fs = split(globpath(join([s:tmpldir, &ft], '/'), 'snip-' . a:name . '.*'), "\n") + else + let fs = split(globpath(join([s:tmpldir, &ft], '/'), 'base-' . a:name . '.*'), "\n") + endif + if len(fs) == 0 + echomsg 'Template '.a:name.' is not exists.' + return + endif + let f = fs[0] + if !filereadable(f) + echomsg 'Template '.a:name.' is not exists.' + return + endif + let c = join(readfile(f, "b"), "\n") + let c = substitute(c, '{{_name_}}', expand('%:t:r:'), 'g') + let tmp = c + let mx = '{{_input_:\(.\{-}\)}}' + let vars = [] + while 1 + let match = matchstr(tmp, mx) + if len(match) == 0 + break + endif + let var = substitute(match, mx, '\1', 'ig') + if index(vars, var) == -1 + call add(vars, var) + endif + let tmp = tmp[stridx(tmp, match) + len(match):] + endwhile + for var in vars + let val = input(var . ":") + let c = substitute(c, '\V{{_input_:'.var.'}}', '\=val', 'g') + endfor + let c = substitute(c, '{{_if_:\(.\{-}\);\(.\{-}\)\(;\(.\{-}\)\)\{-}}}', '\=eval(submatch(1))?submatch(2):submatch(4)', 'g') + let c = substitute(c, '{{_expr_:\(.\{-}\)}}', '\=eval(submatch(1))', 'g') + if len(c) == 0 + return + endif + if !buffer_is_not_empty + silent! %d _ + silent! put = c + silent! normal! ggdd + else + if c[len(c)-1] == "\n" + let c = c[:-2] + endif + let line = getline('.') + let indent = matchstr(line, '^\(\s*\)') + if line =~ '^\s*$' && line('.') != line('$') + silent! normal dd + endif + let c = indent . substitute(c, "\n", "\n".indent, 'g') + if len(indent) && (&expandtab || indent =~ '^ \+$') + let c = substitute(c, "\t", repeat(' ', min([len(indent), &tabstop])), 'g') + endif + silent! put! = c + endif + if stridx(c, '{{_cursor_}}') + silent! call search('{{_cursor_}}', 'w') + silent! s/{{_cursor_}}//g + endif + silent! exe "normal! \<c-o>" + startinsert +endfunction + +let &cpo = s:save_cpo +unlet s:save_cpo + +" vim:set et: |