As a PHP developer one has quiet a lot of choices of IDE. Some are graphical will built-in features like debugging, code completion, auto indentation, syntax highlighting, code checking and many more. But those IDEs are very heavy and slow to use, and I know many people like me who just can’t live without Vim and want to use Vim for all type of text editing they do, whether they are writing code, editing configuration files or may be creating simple text files.

Recently I posted a screenshot of my Vim editor and got a lot of emails that how did I setup Vim that way. So, I hope this howto will be easy enough for everyone to follow and setup their Vim as their PHP IDE. For the sake of simplicity I am assuming you are using Vim on Linux or Linux like system. If you are a windows user then this guide should still work for you, but I might not be able to provide Windows related details where needed.

Features that we will add or enable in Vim to make it a complete IDE.

Code Completion

Tag Lists

Project Management

Syntax Highlighting

Code Checking

First we need to download following Vim scripts and extract them in our ~/.vim directory.

Download above scripts one by one and install them. Installing them is easy just unzip them in you .vim directory which is located in your home directory. Now we need to download few files in our .vim/plugin directory. Download the following Vim scripts directly into your .vim/plugin directory.

Now that you have installed above scripts, you are almost all set to go. You just need to paste the following content in your .vimrc file which is located in your home directory.

"" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" " " ~/.vimrc " "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" " " " " Version: 0.1 " " " " " "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" " Hightlight the ifs and buts syntax on " Plugins and indentation based on the file type filetype plugin indent on " Don't remember source of this, i think it was already in my .vimrc " Tell vim to remember certain things when we exit " '10 : marks will be remembered for up to 10 previously edited files " " 100 : will save up to 100 lines for each register " :5000 : up to 5000 lines of command-line history will be remembered " % : saves and restores the buffer list " n... : where to save the viminfo files set viminfo = '10, \" 100,:5000,%,n~/.viminfo " omnicomplete from: http://vim.wikia.com/wiki/VimTip1386 set completeopt=longest,menuone inoremap <expr> <CR> pumvisible() ? " \< C-y>" : " \< C-g>u \< CR>" inoremap <expr> <C-n> pumvisible() ? ' < C - n > ' : \ ' < C - n >< C - r > = pumvisible ( ) ? " \< lt>Down>" : "" <CR> ' "########################### "## PHP ## "########################### " The php doc plugin " source ~/.vim/php-doc.vim inoremap <C-P> <ESC>:call PhpDocSingle()<CR>i nnoremap <C-P> :call PhpDocSingle()<CR> vnoremap <C-P> :call PhpDocRange()<CR> " run file with PHP CLI (CTRL-M) :autocmd FileType php noremap <C-M> :w!<CR>:!/usr/bin/php %<CR> " PHP parser check (CTRL-L) :autocmd FileType php noremap <C-L> :!/usr/bin/php -l %<CR> " Do use the currently active spell checking for completion though! " (I love this feature :-) set complete+=kspell " disable tabs set expandtab set shiftwidth=4 set softtabstop=4 " highlt matches set hlsearch " Taken from http://peterodding.com/code/vim/profile/vimrc " Make Vim open and close folded text as needed because I can' t be bothered to " do so myself and wouldn't use text folding at all if it wasn't automatic. set foldmethod =marker foldopen =all, insert foldclose =all " Enable enhanced command line completion. set wildmenu wildmode = list : full " Ignore these filenames during enhanced command line completion. set wildignore + = *. aux, *. out, *. toc " LaTeX intermediate files set wildignore + = *. jpg, *. bmp, *. gif " binary images set wildignore + = *. luac " Lua byte code set wildignore + = *. o, *. obj, *. exe , *. dll, *. manifest " compiled object files set wildignore + = *. pyc " Python byte code set wildignore + = *. spl " compiled spelling word lists set wildignore + = *. sw ? " Vim swap files " Enable completion dictionaries for PHP buffers. autocmd FileType php set complete + =k ~/. vim / dict / PHP . dict " PHP Autocomplete autocmd FileType php set omnifunc =phpcomplete#CompletePHP set ofu =syntaxcomplete#Complete " You might also find this useful " PHP Generated Code Highlights (HTML & SQL) let php_sql_query= 1 let php_htmlInStrings= 1 let g : php_folding= 2 set foldmethod = syntax " -------------------- " Project " -------------------- map < A - S - p > : Project < CR > map < A - S - o > : Project < CR >: redraw < CR >/ nmap <silent> <F3> < Plug > ToggleProject "let g:proj_window_width = 30 "let g:proj_window_increment = 150 nnoremap <silent> <F8> : TlistToggle < CR > let Tlist_Exit_OnlyWindow = 1 " exit if taglist is last window open let Tlist_Show_One_File = 1 " Only show tags for current buffer let Tlist_Enable_Fold_Column = 0 " no fold column (only showing one file) let tlist_sql_settings = 'sql;P:package;t:table' let tlist_ant_settings = 'ant;p:Project;r:Property;t:Target' " auto change directory from: http://vim.wikia.com/wiki/Set_working_directory_to_the_current_file autocmd BufEnter * if expand ( "%:p:h" ) !~ '^/tmp' | lcd %: p : h | endif " when we reload, tell vim to restore the cursor to the saved position augroup JumpCursorOnEdit au ! autocmd BufReadPost * \ if expand ( "<afile>:p:h" ) ! = ? $ TEMP | \ if line ( "' \" " ) > 1 && line ( "' \" " ) < = line ( "$" ) | \ let JumpCursorOnEdit_foo = line ( "' \" " ) | \ let b : doopenfold = 1 | \ if ( foldlevel ( JumpCursorOnEdit_foo ) > foldlevel ( JumpCursorOnEdit_foo - 1 ) ) | \ let JumpCursorOnEdit_foo = JumpCursorOnEdit_foo - 1 | \ let b : doopenfold = 2 | \ endif | \ exe JumpCursorOnEdit_foo | \ endif | \ endif " Need to postpone using " zv " until after reading the modelines. autocmd BufWinEnter * \ if exists ( "b:doopenfold" ) | \ exe "normal zv" | \ if ( b : doopenfold > 1 ) | \ exe "+" . 1 | \ endif | \ unlet b : doopenfold | \ endif augroup END " PHP code sniffer " If code sniffer is installed you can run it on current php file by running " :Phpcs function ! RunPhpcs ( ) let l : filename= @% let l : phpcs_output= system ( 'phpcs --report=csv --standard=YMC ' . l : filename ) " echo l:phpcs_output let l : phpcs_list= split ( l : phpcs_output, "

" ) unlet l : phpcs_list [ 0 ] cexpr l : phpcs_list cwindow endfunction set errorformat + =\ "%f \" \\ ,%l \\ ,%c \\ ,%t%*[a-zA-Z] \\ , \" %m \" command! Phpcs execute RunPhpcs() """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" " ~/.vimrc " """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" " " " Version: 0.1 " " " " " """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" " Hightlight the ifs and buts syntax on " Plugins and indentation based on the file type filetype plugin indent on " Don't remember source of this, i think it was already in my .vimrc " Tell vim to remember certain things when we exit " '10 : marks will be remembered for up to 10 previously edited files " "100 : will save up to 100 lines for each register " :5000 : up to 5000 lines of command-line history will be remembered " % : saves and restores the buffer list " n... : where to save the viminfo files set viminfo='10,\"100,:5000,%,n~/.viminfo " omnicomplete from: http://vim.wikia.com/wiki/VimTip1386 set completeopt=longest,menuone inoremap <expr> <CR> pumvisible() ? "\<C-y>" : "\<C-g>u\<CR>" inoremap <expr> <C-n> pumvisible() ? '<C-n>' : \ '<C-n><C-r>=pumvisible() ? "\<lt>Down>" : ""<CR>' "########################### "## PHP ## "########################### " The php doc plugin " source ~/.vim/php-doc.vim inoremap <C-P> <ESC>:call PhpDocSingle()<CR>i nnoremap <C-P> :call PhpDocSingle()<CR> vnoremap <C-P> :call PhpDocRange()<CR> " run file with PHP CLI (CTRL-M) :autocmd FileType php noremap <C-M> :w!<CR>:!/usr/bin/php %<CR> " PHP parser check (CTRL-L) :autocmd FileType php noremap <C-L> :!/usr/bin/php -l %<CR> " Do use the currently active spell checking for completion though! " (I love this feature :-) set complete+=kspell " disable tabs set expandtab set shiftwidth=4 set softtabstop=4 " highlt matches set hlsearch " Taken from http://peterodding.com/code/vim/profile/vimrc " Make Vim open and close folded text as needed because I can't be bothered to " do so myself and wouldn't use text folding at all if it wasn't automatic. set foldmethod=marker foldopen=all,insert foldclose=all " Enable enhanced command line completion. set wildmenu wildmode=list:full " Ignore these filenames during enhanced command line completion. set wildignore+=*.aux,*.out,*.toc " LaTeX intermediate files set wildignore+=*.jpg,*.bmp,*.gif " binary images set wildignore+=*.luac " Lua byte code set wildignore+=*.o,*.obj,*.exe,*.dll,*.manifest " compiled object files set wildignore+=*.pyc " Python byte code set wildignore+=*.spl " compiled spelling word lists set wildignore+=*.sw? " Vim swap files " Enable completion dictionaries for PHP buffers. autocmd FileType php set complete+=k~/.vim/dict/PHP.dict " PHP Autocomplete autocmd FileType php set omnifunc=phpcomplete#CompletePHP set ofu=syntaxcomplete#Complete " You might also find this useful " PHP Generated Code Highlights (HTML & SQL) let php_sql_query=1 let php_htmlInStrings=1 let g:php_folding=2 set foldmethod=syntax " -------------------- " Project " -------------------- map <A-S-p> :Project<CR> map <A-S-o> :Project<CR>:redraw<CR>/ nmap <silent> <F3> <Plug>ToggleProject "let g:proj_window_width = 30 "let g:proj_window_increment = 150 nnoremap <silent> <F8> :TlistToggle<CR> let Tlist_Exit_OnlyWindow = 1 " exit if taglist is last window open let Tlist_Show_One_File = 1 " Only show tags for current buffer let Tlist_Enable_Fold_Column = 0 " no fold column (only showing one file) let tlist_sql_settings = 'sql;P:package;t:table' let tlist_ant_settings = 'ant;p:Project;r:Property;t:Target' " auto change directory from: http://vim.wikia.com/wiki/Set_working_directory_to_the_current_file autocmd BufEnter * if expand("%:p:h") !~ '^/tmp' | lcd %:p:h | endif " when we reload, tell vim to restore the cursor to the saved position augroup JumpCursorOnEdit au! autocmd BufReadPost * \ if expand("<afile>:p:h") !=? $TEMP | \ if line("'\"") > 1 && line("'\"") <= line("$") | \ let JumpCursorOnEdit_foo = line("'\"") | \ let b:doopenfold = 1 | \ if (foldlevel(JumpCursorOnEdit_foo) > foldlevel(JumpCursorOnEdit_foo - 1)) | \ let JumpCursorOnEdit_foo = JumpCursorOnEdit_foo - 1 | \ let b:doopenfold = 2 | \ endif | \ exe JumpCursorOnEdit_foo | \ endif | \ endif " Need to postpone using "zv" until after reading the modelines. autocmd BufWinEnter * \ if exists("b:doopenfold") | \ exe "normal zv" | \ if(b:doopenfold > 1) | \ exe "+".1 | \ endif | \ unlet b:doopenfold | \ endif augroup END " PHP code sniffer " If code sniffer is installed you can run it on current php file by running " :Phpcs function! RunPhpcs() let l:filename=@% let l:phpcs_output=system('phpcs --report=csv --standard=YMC '.l:filename) " echo l:phpcs_output let l:phpcs_list=split(l:phpcs_output, "

") unlet l:phpcs_list[0] cexpr l:phpcs_list cwindow endfunction set errorformat+=\"%f\"\\,%l\\,%c\\,%t%*[a-zA-Z]\\,\"%m\" command! Phpcs execute RunPhpcs()

Thats it, now you are all set to go. Following are the few quick commands to get you started to use all the features you have just enabled in your Vim IDE.

F3: To start using project manager.

\C: After starting project manager this key combination will allow you to add new project.

F8: Tag list window

Ctrl+L: To run the syntax checking on your php file

Ctrl+P: On any class/function definition to add php doc strings

“:PhpCs”: To run PHP Code sniffer on your php script. (this requires code sniffer to be installed).

Ctrl+n: On any word to use Auto completion feature of PHP.

I will soon write another howto to explain how can you use further features of your IDE. You should subscribe to the feed or follow me on twitter to stay updated. 🙂