let s:old_cfu = ''

function! complete#reset()
  let &completefunc = s:old_cfu
  let s:old_cfu = ''
  augroup CompleteTrigger
    au!
  augroup END
endfunction

function! complete#trigger(func)
  if s:old_cfu == ''
    let s:old_cfu = &completefunc
  endif
  let &completefunc = a:func
  augroup CompleteTrigger
    au!
    au CursorMovedI * call complete#reset()
  augroup END
  return "\<c-x>\<c-u>"
endfunction

" Example Completers
"-------------------
"
function! complete#short_files_in_path(findstart, base)
  if a:findstart
    let line = getline('.')
    let start = col('.') - 1
    while start > 0 && line[start - 1] =~ '\f'
      let start -= 1
    endwhile
    return start
  else
    let res = map(globpath(&path, a:base . '*', 0, 1)
          \, 'fnamemodify(v:val, ":t")')
    return res
  endif
endfunction

function! complete#files_in_path(findstart, base)
  if a:findstart
    let line = getline('.')
    let start = col('.') - 1
    while start > 0 && line[start - 1] =~ '\f'
      let start -= 1
    endwhile
    return start
  else
    let res = map(globpath(&path, a:base . '*', 0, 1)
          \, 'substitute(v:val, "^\.\/", "", "")')
    return res
  endif
endfunction

function! complete#foist(findstart, base)
  if a:findstart
    return 0
  else
    let base = matchstr(a:base, '^\s*\zs.*\ze\s*$')
    let all_buf_lines = []
    let curbuf = bufnr('%')
    silent bufdo call extend(all_buf_lines, getline(1, '$'))
    exe "buffer " . curbuf
    return filter(all_buf_lines, 'stridx(v:val, base) > -1')
  endif
endfunction