" Vim global plugin for autoloading cscope databases. " Last Change: Fri Nov 30 17:03:47 CST 2001 " Maintainer: Michael Conrad Tilsra " Revision: 0.2 if exists("loaded_autoload_cscope") finish endif let loaded_autoload_cscope = 1 let s:save_cpo = &cpo set cpo&vim " If you set this to anything other than 1, the menu and macros will not be " loaded. Useful if you have your own that you like. Or don't want my stuff " clashing with any macros you've made. if !exists("g:autocscope_menus") let g:autocscope_menus = 1 endif "== " windowdir " Gets the directory for the file in the current window " Or the current working dir if there isn't one for the window. " FIXME This still doesn't always work. If you open a buffer with " gvim dir/file.c it ony gets `dir' and not the stuff before... function s:windowdir() if winbufnr(0) == -1 return getcwd() endif let wndr = bufname(winbufnr(0)) let fr = match(wndr, "/[^/]*$") if fr == -1 return getcwd() endif return strpart(wndr, 0, fr) endfunc " "== " Find_in_parent " find the file argument and returns the path to it. " Starting with the current working dir, it walks up the parent folders " until it finds the file, or it hits the stop dir. " If it doesn't find it, it returns "Nothing" function s:Find_in_parent(fln,flsrt,flstp) let here = a:flsrt while ( strlen( here) > 0 ) if filereadable( here . "/" . a:fln ) return here endif let fr = match(here, "/[^/]*$") if fr == -1 break endif let here = strpart(here, 0, fr) if here == a:flstp break endif endwhile return "Nothing" endfunc " "== " Cycle_macros_menus " if there are cscope connections, activate that stuff. " Else toss it out. " TODO Maybe I should move this into a seperate plugin? let s:menus_loaded = 0 function s:Cycle_macros_menus() if g:autocscope_menus != 1 return endif if cscope_connection() if s:menus_loaded == 1 return endif let s:menus_loaded = 1 set csto=0 set cst silent! map s :cs find c =expand("") silent! map g :cs find g =expand("") silent! map d :cs find d =expand("") silent! map c :cs find c =expand("") silent! map t :cs find t =expand("") silent! map e :cs find e =expand("") silent! map f :cs find f =expand("") silent! map i :cs find i =expand("") if has("menu") nmenu &Cscope.Find.Symbols \ :cs find s =expand("") nmenu &Cscope.Find.Definitiong \ :cs find g =expand("") nmenu &Cscope.Find.Calledd \ :cs find d =expand("") nmenu &Cscope.Find.Callingc \ :cs find c =expand("") nmenu &Cscope.Find.Assignmentt \ :cs find t =expand("") nmenu &Cscope.Find.Egrepe \ :cs find e =expand("") nmenu &Cscope.Find.Filef \ :cs find f =expand("") nmenu &Cscope.Find.Includingi \ :cs find i =expand("") " nmenu &Cscope.Add :cs add " nmenu &Cscope.Remove :cs kill nmenu &Cscope.Reset :cs reset nmenu &Cscope.Show :cs show " Need to figure out how to do the add/remove. May end up writing " some container functions. Or tossing them out, since this is supposed " to all be automatic. endif else let s:menus_loaded = 0 set nocst silent! unmap s silent! unmap g silent! unmap d silent! unmap c silent! unmap t silent! unmap e silent! unmap f silent! unmap i if has("menu") " would rather see if the menu exists, then remove... silent! nunmenu Cscope endif endif endfunc " "== " Unload_csdb " drop cscope connections. function s:Unload_csdb() if exists("b:csdbpath") if cscope_connection(3, "out", b:csdbpath) let save_csvb = &csverb set nocsverb exe "cs kill " . b:csdbpath set csverb let &csverb = save_csvb endif endif endfunc " "== " Cycle_csdb " cycle the loaded csccope db. function s:Cycle_csdb() if has("cscope") if exists("b:csdbpath") if cscope_connection(3, "out", b:csdbpath) return "it is already loaded. don't try to reload it. endif endif let newcsdbpath = s:Find_in_parent("cscope.out",s:windowdir(),$HOME) " echo "Found cscope.out at: " . newcsdbpath " echo "Windowdir: " . s:windowdir() if newcsdbpath != "Nothing" let b:csdbpath = newcsdbpath if !cscope_connection(3, "out", b:csdbpath) let save_csvb = &csverb set nocsverb exe "cs add " . b:csdbpath . "/cscope.out " . b:csdbpath set csverb let &csverb = save_csvb endif " else " No cscope database, undo things. (someone rm-ed it or somesuch) call s:Unload_csdb() endif endif endfunc " auto toggle the menu augroup autoload_cscope au! au BufEnter *.[chly] call Cycle_csdb() | call Cycle_macros_menus() au BufEnter *.cc call Cycle_csdb() | call Cycle_macros_menus() au BufUnload *.[chly] call Unload_csdb() | call Cycle_macros_menus() au BufUnload *.cc call Unload_csdb() | call Cycle_macros_menus() augroup END let &cpo = s:save_cpo