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 /plugin | |
parent | b0a78235099adb8ca9fe0b0def31cafedf99cb14 (diff) | |
download | vim-sonictemplate-89570a0c24203344bc5e15aca6a335e2bc0bf7ee.tar.gz vim-sonictemplate-89570a0c24203344bc5e15aca6a335e2bc0bf7ee.tar.bz2 vim-sonictemplate-89570a0c24203344bc5e15aca6a335e2bc0bf7ee.zip |
autoload.
Diffstat (limited to 'plugin')
-rw-r--r-- | plugin/template.vim | 101 |
1 files changed, 7 insertions, 94 deletions
diff --git a/plugin/template.vim b/plugin/template.vim index 5991c41..1a832a6 100644 --- a/plugin/template.vim +++ b/plugin/template.vim @@ -1,101 +1,14 @@ -" template.vim: Vim commands to load template. +"============================================================================= +" template.vim +" Author: Yasuhiro Matsumoto <mattn.jp@gmail.com> +" Last Change: 28-Oct-2011. " -" This filetype plugin adds one command for the buffers: +" Vim commands to load template. " " :Template {name} " Load template named as {name} in the current buffer. -command! -nargs=1 -complete=customlist,TemplateComplete Template call s:Template(<f-args>) -inoremap <c-y>t <esc>:call TemplateSelect()<cr> - -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! TemplateSelect() abort - let name = input(':Template ', '', 'customlist,TemplateComplete') - if name == '' - return - endif - call s:Template(name) -endfunction - -function! TemplateComplete(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! s:Template(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 +command! -nargs=1 -complete=customlist,template#complete Template call template#apply(<f-args>) +inoremap <c-y>t <esc>:call template#select()<cr> " vim:ts=4:sw=4:et |