Skip to content
This repository

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
tree: 220347a0dd
Fetching contributors…

Cannot retrieve contributors at this time

file 47 lines (44 sloc) 1.531 kb
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47
" This file demonstrates
" - how to register your own snippet sources (call snipMate_python_demo#Activate() in ftplugin/python.vim)
" - implents a source which creates snippets based on python function
" definitions found in the current file
"
" Example:
"
" def abc(a,b,c=None)
" will create a snippet on the fly which looks like this:
" abc(${1:a}, ${2:b}, ${3:c=None})

fun! snipMate_python_demo#Activate()
  if !exists('g:snipMateSources')
    let g:snipMateSources = {}
  endif

  let g:snipMateSources['python'] = funcref#Function('snipMate_python_demo#FunctionsFromCurrentFileAndTags')
endf

fun! s:Add(dict, line, source, trigger)
  let matched = matchlist(a:line,'def\s\+\([^( \t]\+\)[ \t]*(\([^)]*\)')
  if len(matched) > 2
    let name = matched[1]
" TODO: is this a glob?
    if name !~ a:trigger | return | endif
    let a:dict[name] = get(a:dict, name, {})
    let sd = a:dict[name]
    let args = []
    let nr=1
    for arg in split(matched[2], '\s*,\s*')
      call add(args, '${'.nr.':'.arg.'}')
      let nr+=1
    endfor
    let sd[a:source] = name.'('.join(args,', ').')'
  endif
endf
fun! snipMate_python_demo#FunctionsFromCurrentFileAndTags(scopes, trigger, result)
" getting all might be too much
  if a:trigger == '*' | return | endif
  if index(a:scopes, 'python') < 0 | return | endif
  for t in taglist('^'.a:trigger)
    call s:Add(a:result, t.cmd, 'tags-' . t.filename, a:trigger)
  endfor
  for l in getline(0, line('$'))
    call s:Add(a:result, l, 'current-file', a:trigger)
  endfor
endf
Something went wrong with that request. Please try again.