Vim Tricks
Vim and PHP for coding utopia including advanced techniques such as cscope
vimrc tips
- if you put these 2 lines in your vimrc, you can use :make to check your php code for typos:
set makeprg=php\ -l\ % set errorformat=%m\ in\ %f\ on\ line\ %l
cscope
vim + cscope is insanely cool.
This shell script will set up your machine with the stuff described below. all you need to do is download it, set the file executable and run it.
curl http://www.bitweaver.org/liberty/download/file/884 -o vim-cscope
chmod +x vim-cscope
./vim-cscopeWhat'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
/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 else echo "Directory not found: $arg" fi done
- Have a periodic crontab like:
cronjob
0 * * * * /usr/local/bin/cscope-php /path/to/project1 /other/path/to/project2
-
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 - Add the following to your ~/.vimrc (or /etc/vimrc for cool people)
~/.vimrc or /etc/vimrc
" Some cscope 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 endif " reset cscope verbosity set csverb " easily reload cscope database nmap <F11> :cs reset<cr> endif
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- if filereadable("cscope.out")
- cs add cscope.out
- " else add the database pointed to by environment variable
- elseif $CSCOPE_DB != ""
- cs add $CSCOPE_DB
- endif
- To test if this worked:
$ 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.
Using it all
Some funky tips on how to use your new setup (taken from cscope_maps.vim):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)
Comments