--- /dev/null
+" unite source: tags file and/or cscope database selection for projects using
+" mkbuild
+
+let s:save_cpo = &cpo
+set cpo&vim
+
+let s:source = {
+ \ 'name': 'xrefs',
+ \ 'description': 'select cross references from a directory',
+ \ 'action_table': {
+ \ 'setxrefs' : { 'is_selectable': 1 },
+ \ },
+ \ 'default_action': 'setxrefs'
+ \ }
+
+function! s:source.action_table.setxrefs.func(candidates)
+ call s:select(a:candidates[0].word)
+endfunction
+
+function! s:select(dirname)
+ if empty(a:dirname)
+ return
+ endif
+ let file = a:dirname . "/tags"
+ let &tags=''
+ if filereadable(file)
+ let &tags = file
+ endif
+ if has('cscope')
+ let file = a:dirname . "/cscope.out"
+ execute 'cscope kill -1'
+ if filereadable(file)
+ execute 'cscope add ' . file
+ endif
+ endif
+endfunction
+
+" Return the results of a command without the ending newline
+function! s:chompsys(cmd)
+ return substitute(system(a:cmd), '\n$', '', '')
+endfunction
+
+function! s:source.gather_candidates(args, context)
+ let cmd = 'find . -maxdepth 4 -type f -name tags -o -name cscope.out | ' .
+ \ 'while read f; do echo $(dirname $f); done | sort -u | sed -e "s|\./||"'
+ let xrefdirs = split(s:chompsys(cmd), '\n')
+
+ return map(xrefdirs, '{ "word": v:val }')
+endfunction
+
+function! unite#sources#xrefs#define()
+ return s:source
+endfunction
+
+let &cpo = s:save_cpo
+unlet s:save_cpo