History of Vim Tricks

^vim + cscope is insanely cool.^

!What's cscope?
cscope will generate a list of functions used in bitweaver and you can use a few keymaps to very quickly jump to those functions from within bitweaver (or any source code tree). cscope is faster and more feature rich than ctags.

! Setting it up
# Install cscope (via rpm, etc)
# Add this file to __/usr/local/bin/cscope-php__ {code source="bash" title="/usr/local/bin/cscope-php"}#!/bin/bash
for arg in "$@"; do
if [ -d $arg ]; then
#echo Create list of php files in cscope.files
find $arg \( -name "*.php" -or -name "*.tpl" \) -and -not -regex "./temp/.*" -and -not -regex ".*/language.php" -print > $arg/cscope.files
#echo Create cscope database in cscope.out
cscope -b -i $arg/cscope.files -f$arg/cscope.out
rm -f $arg/cscope.files
echo "Directory not found: $arg"
# Have a periodic crontab like:{code source="bash" title="cronjob"}0 * * * * /usr/local/bin/cscope-php /path/to/project1 /other/path/to/project2{/code}
# {code source=bash title="get vim plugin"}mkdir -p ~/.vim/plugin/ && curl http://cscope.sourceforge.net/cscope_maps.vim | sed 's/\bcs add\b/" cs add/' > ~/.vim/plugin/cscope_maps.vim{/code}
# Add the following to your ~/.vimrc (or /etc/vimrc for cool people) {code source="vim" title="~/.vimrc or /etc/vimrc"}" Some scsope specific settings
if has("cscope")
" Some scsope specific settings
set cscopequickfix=s-,c-,d-,i-,t-,e-

" always use cscope instead of tags
set cst

" path to cscope
set csprg=/usr/bin/cscope

" search databased before searching tag files
set cscopetagorder=0

" don\'t display cscope messages when adding database
set nocsverb

" add any database in current directory
if filereadable("cscope.out")
cs add cscope.out
" else search up a few directories
elseif filereadable("../cscope.out")
cs add ../cscope.out
elseif filereadable("../../cscope.out")
cs add ../../cscope.out
elseif filereadable("../../../cscope.out")
cs add ../../../cscope.out
elseif filereadable("../../../../cscope.out")
cs add ../../../../cscope.out
elseif filereadable("../../../../../cscope.out")
cs add ../../../../../cscope.out
" else add database pointed to by environment
elseif \$CSCOPE_DB != ""
cs add \$CSCOPE_DB

" reset cscope verbosity
set csverb

" easily reload cscope database
nmap <F11> :cs reset<cr>
+ If you get an error message about a duplicate cscope database has been added, go to your ~/.vim/plugin/cscope_maps.vim file and comment out the section where it says{code source=sh num=41}
if filereadable("cscope.out")
cs add cscope.out
" else add the database pointed to by environment variable
elseif $CSCOPE_DB != ""
cs add $CSCOPE_DB
# To test if this worked:{code source="text"}
$ cd /path/to/bitweaver
$ vim wiki/index.php +/verifyPackage
move your cursor over verifyPackage
<CTRL-\>g will go to where the function was defined
<CTRL-\>s will show all places where the function has been used
use ':copen' to view the complete list.{/code}

! Using it all
Some funky tips on how to use your new setup (taken from cscope_maps.vim):
{code source=text title="Mapping Overview"}
The following maps all invoke one of the following cscope search types:

's' symbol: find all references to the token under cursor
'g' global: find global definition(s) of the token under cursor
'c' calls: find all calls to the function name under cursor
't' text: find all instances of the text under cursor
'e' egrep: egrep search for the word under cursor
'f' file: open the filename under cursor
'i' includes: find files that include the filename under cursor
'd' called: find functions that function under cursor calls

To do the first type of search, hit 'CTRL-\', followed by one of the
cscope search types above (s,g,c,t,e,f,i,d). The result of your cscope
search will be displayed in the current window. You can use CTRL-T to
go back to where you were before the search.

Using 'CTRL-spacebar' (intepreted as CTRL-@ by vim) then a search type
makes the vim window split horizontally, with search result displayed in
the new window.

Hitting CTRL-space *twice* before the search type does a vertical
split instead of a horizontal one (vim 6 and up only)

As you can see above, there's many new ways to now navigate your project. Very cool stuff happens when you move the curson over a function like __verifyPackage__ in wiki/edit.php and then do:
# vim wiki/edit.php +/verifyPackage (open the file on the first occurrance of verifyPackage)
# n (to move the cursor to verifyPackage)
# <CTRL-\>s (this will search the database for all occurances of verifyPackage)
# :copen (will open a window with a list of all occurrances of verifyPackage)
# navigate to the occurrance you're interested in and hit <enter>
# <CTRL-O> (move backward in your jump history - might need to hit this more than once to return to edit/wiki.php)
# <CTRL-I> (move forward in your jump history)
Page History
25 Jul 2008 (18:26 UTC)
Current • Source
View • Compare • Difference • Source
View • Compare • Difference • Source
View • Compare • Difference • Source
View • Compare • Difference • Source
View • Compare • Difference • Source
View • Compare • Difference • Source
View • Compare • Difference • Source
View • Compare • Difference • Source
View • Compare • Difference • Source
View • Compare • Difference • Source
View • Compare • Difference • Source
View • Compare • Difference • Source