diff options
author | Adam Stankiewicz <sheerun@sher.pl> | 2013-09-12 16:33:12 +0200 |
---|---|---|
committer | Adam Stankiewicz <sheerun@sher.pl> | 2013-09-12 16:33:12 +0200 |
commit | d96dc724d442bbc9788815ab3da09d9fff0555a9 (patch) | |
tree | f4b1859aa45a28cd420c7285006a4398726ff18a /ftplugin | |
parent | d4eca3f2eb6c8496261ed252596d6813b9eb8a04 (diff) | |
download | vim-polyglot-d96dc724d442bbc9788815ab3da09d9fff0555a9.tar.gz vim-polyglot-d96dc724d442bbc9788815ab3da09d9fff0555a9.zip |
Add extended php support
Diffstat (limited to 'ftplugin')
-rw-r--r-- | ftplugin/php.vim | 202 | ||||
-rw-r--r-- | ftplugin/php/doc.vim | 547 |
2 files changed, 749 insertions, 0 deletions
diff --git a/ftplugin/php.vim b/ftplugin/php.vim new file mode 100644 index 00000000..1ecdb2b3 --- /dev/null +++ b/ftplugin/php.vim @@ -0,0 +1,202 @@ +" File: php.vim +" Description: PHP Integration for VIM plugin +" This file is a considerable fork of the original +" PDV written by Tobias Schlitt <toby@php.net>. +" Maintainer: Steve Francia <piv@spf13.com> <http://spf13.com> +" Version: 0.9 +" Last Change: 7th January 2012 +" +" +" Section: script init stuff {{{1 +if exists("loaded_piv") + finish +endif +let loaded_piv = 1 + +" +" Function: s:InitVariable() function {{{2 +" This function is used to initialise a given variable to a given value. The +" variable is only initialised if it does not exist prior +" +" Args: +" -var: the name of the var to be initialised +" -value: the value to initialise var to +" +" Returns: +" 1 if the var is set, 0 otherwise +function s:InitVariable(var, value) + if !exists(a:var) + exec 'let ' . a:var . ' = ' . "'" . a:value . "'" + return 1 + endif + return 0 +endfunction + + +" {{{ Settings +" First the global PHP configuration +let php_sql_query=1 " to highlight SQL syntax in strings +let php_htmlInStrings=1 " to highlight HTML in string +let php_noShortTags = 1 " to disable short tags +let php_folding = 1 "to enable folding for classes and functions +let PHP_autoformatcomment = 1 +let php_sync_method = -1 + +" Section: variable init calls {{{2 +call s:InitVariable("g:load_doxygen_syntax", 1) +call s:InitVariable("g:syntax_extra_php", 'doxygen') +call s:InitVariable("g:syntax_extra_inc", 'doxygen') +call s:InitVariable("g:PIVCreateDefaultMappings", 1) +call s:InitVariable("g:PIVPearStyle", 0) +call s:InitVariable("g:PIVAutoClose", 0) + +" Auto expand tabs to spaces +setlocal expandtab +setlocal autoindent " Auto indent after a { +setlocal smartindent + +" Linewidth to 79, because of the formatoptions this is only valid for +" comments +setlocal textwidth=79 + +setlocal nowrap " Do not wrap lines automatically + +" Correct indentation after opening a phpdocblock and automatic * on every +" line +setlocal formatoptions=qroct + +" Use php syntax check when doing :make +setlocal makeprg=php\ -l\ % + +" Use errorformat for parsing PHP error output +setlocal errorformat=%m\ in\ %f\ on\ line\ %l + +" Switch syntax highlighting on, if it was not +if !exists("g:syntax_on") | syntax on | endif + +"setlocal keywordprg=pman " Use pman for manual pages + +" }}} Settings + +" {{{ Command mappings +nnoremap <silent> <plug>PIVphpDocSingle :call PhpDocSingle()<CR> +vnoremap <silent> <plug>PIVphpDocRange :call PhpDocRange()<CR> +vnoremap <silent> <plug>PIVphpAlign :call PhpAlign()<CR> +"inoremap <buffer> <leader>d :call PhpDocSingle()<CR>i + +" Map ; to "add ; to the end of the line, when missing" +"noremap <buffer> ; :s/\([^;]\)$/\1;/<cr> + +" Map <ctrl>+p to single line mode documentation (in insert and command mode) +"inoremap <buffer> <leader>d :call PhpDocSingle()<CR>i +"nnoremap <buffer> <leader>d :call PhpDocSingle()<CR> +" Map <ctrl>+p to multi line mode documentation (in visual mode) +"vnoremap <buffer> <leader>d :call PhpDocRange()<CR> + +" Map <CTRL>-H to search phpm for the function name currently under the cursor (insert mode only) +inoremap <buffer> <C-H> <ESC>:!phpm <C-R>=expand("<cword>")<CR><CR> + +" }}} + +" {{{ Automatic close char mapping +if g:PIVAutoClose + if g:PIVPearStyle + inoremap <buffer> { {<CR>}<C-O>O + inoremap <buffer> ( ( )<LEFT><LEFT> + else + inoremap { {<CR>}<C-O>O + inoremap ( ()<LEFT> + endif + + inoremap <buffer> [ []<LEFT> + inoremap <buffer> " ""<LEFT> + inoremap <buffer> ' ''<LEFT> +endif +" }}} Automatic close char mapping + + +" {{{ Wrap visual selections with chars + +vnoremap <buffer> ( "zdi(<C-R>z)<ESC> +vnoremap <buffer> { "zdi{<C-R>z}<ESC> +vnoremap <buffer> [ "zdi[<C-R>z]<ESC> +vnoremap <buffer> ' "zdi'<C-R>z'<ESC> +" Removed in favor of register addressing +" :vnoremap " "zdi"<C-R>z"<ESC> + +" }}} Wrap visual selections with chars + +" {{{ Dictionary completion +setlocal dictionary-=$VIMRUNTIME/bundle/PIV/misc/funclist.txt dictionary+=$VIMRUNTIME/bundle/PIV/misc/funclist.txt + +" Use the dictionary completion +setlocal complete-=k complete+=k + +" }}} Dictionary completion + +" {{{ Alignment + +func! PhpAlign() range + let l:paste = &g:paste + let &g:paste = 0 + + let l:line = a:firstline + let l:endline = a:lastline + let l:maxlength = 0 + while l:line <= l:endline + " Skip comment lines + if getline (l:line) =~ '^\s*\/\/.*$' + let l:line = l:line + 1 + continue + endif + " \{-\} matches ungreed * + let l:index = substitute (getline (l:line), '^\s*\(.\{-\}\)\s*\S\{0,1}=\S\{0,1\}\s.*$', '\1', "") + let l:indexlength = strlen (l:index) + let l:maxlength = l:indexlength > l:maxlength ? l:indexlength : l:maxlength + let l:line = l:line + 1 + endwhile + + let l:line = a:firstline + let l:format = "%s%-" . l:maxlength . "s %s %s" + + while l:line <= l:endline + if getline (l:line) =~ '^\s*\/\/.*$' + let l:line = l:line + 1 + continue + endif + let l:linestart = substitute (getline (l:line), '^\(\s*\).*', '\1', "") + let l:linekey = substitute (getline (l:line), '^\s*\(.\{-\}\)\s*\(\S\{0,1}=\S\{0,1\}\)\s\(.*\)$', '\1', "") + let l:linesep = substitute (getline (l:line), '^\s*\(.\{-\}\)\s*\(\S\{0,1}=\S\{0,1\}\)\s\(.*\)$', '\2', "") + let l:linevalue = substitute (getline (l:line), '^\s*\(.\{-\}\)\s*\(\S\{0,1}=\S\{0,1\}\)\s\(.*\)$', '\3', "") + + let l:newline = printf (l:format, l:linestart, l:linekey, l:linesep, l:linevalue) + call setline (l:line, l:newline) + let l:line = l:line + 1 + endwhile + let &g:paste = l:paste +endfunc + +" }}} + +function! s:CreateNMap(target, combo) + if !hasmapto(a:target, 'n') + exec 'nmap ' . a:combo . ' ' . a:target + endif +endfunction + +function! s:CreateVMap(target, combo) + if !hasmapto(a:target, 'v') + exec 'vmap ' . a:combo . ' ' . a:target + endif +endfunction + +function! s:CreateMaps(target, combo) + call s:CreateNMap(a:target,a:combo) + call s:CreateVMap(a:target,a:combo) +endfunction + +if g:PIVCreateDefaultMappings + call s:CreateNMap('<plug>PIVphpDocSingle', ',pd') + call s:CreateVMap('<plug>PIVphpDocRange', ',pd') + call s:CreateMaps('<plug>PIVphpAlign ', ',pa') +endif diff --git a/ftplugin/php/doc.vim b/ftplugin/php/doc.vim new file mode 100644 index 00000000..0137d68b --- /dev/null +++ b/ftplugin/php/doc.vim @@ -0,0 +1,547 @@ +" PDV (phpDocumentor for Vim) +" =========================== +" +" Version: 1.1.3 +" +" Copyright 2005 by Tobias Schlitt <toby@php.net> +" Inspired by phpDoc script for Vim by Vidyut Luther (http://www.phpcult.com/). +" + +" modified by kevin olson (acidjazz@gmail.com) - 03/19/2009 +" - added folding support +" +" Provided under the GPL (http://www.gnu.org/copyleft/gpl.html). +" +" This script provides functions to generate phpDocumentor conform +" documentation blocks for your PHP code. The script currently +" documents: +" +" - Classes +" - Methods/Functions +" - Attributes +" +" All of those supporting all PHP 4 and 5 syntax elements. +" +" Beside that it allows you to define default values for phpDocumentor tags +" like @version (I use $id$ here), @author, @license and so on. +" +" For function/method parameters and attributes, the script tries to guess the +" type as good as possible from PHP5 type hints or default values (array, bool, +" int, string...). +" +" You can use this script by mapping the function PhpDoc() to any +" key combination. Hit this on the line where the element to document +" resides and the doc block will be created directly above that line. +" +" Installation +" ============ +" +" For example include into your .vimrc: +" +" source ~/.vim/php-doc.vim +" imap <C-o> :set paste<CR>:call PhpDoc()<CR>:set nopaste<CR>i +" +" This includes the script and maps the combination <ctrl>+o (only in +" insert mode) to the doc function. +" +" Changelog +" ========= +" +" Version 1.0.0 +" ------------- +" +" * Created the initial version of this script while playing around with VIM +" scripting the first time and trying to fix Vidyut's solution, which +" resulted in a complete rewrite. +" +" Version 1.0.1 +" ------------- +" * Fixed issues when using tabs instead of spaces. +" * Fixed some parsing bugs when using a different coding style. +" * Fixed bug with call-by-reference parameters. +" * ATTENTION: This version already has code for the next version 1.1.0, +" which is propably not working! +" +" Version 1.1.0 (preview) +" ------------- +" * Added foldmarker generation. +" + +" Version 1.1.2 +" ------------- +" * Completed foldmarker commenting for functions +" + + + +if has ("user_commands") + +" {{{ Globals + +" After phpDoc standard +let g:pdv_cfg_CommentHead = "/**" +let g:pdv_cfg_Comment1 = " * " +let g:pdv_cfg_Commentn = " * " +let g:pdv_cfg_CommentTail = " */" +let g:pdv_cfg_CommentEnd = "/* }}} */" +let g:pdv_cfg_CommentSingle = "//" + +" Default values +let g:pdv_cfg_Type = "mixed" +" let g:pdv_cfg_Package = "Framework" +let g:pdv_cfg_Package = "Webdav" +let g:pdv_cfg_Version = "//autogen//" +let g:pdv_cfg_Author = "" +let g:pdv_cfg_Copyright = "Copyright (c) 2010 All rights reserved." +let g:pdv_cfg_License = "PHP Version 3.0 {@link http://www.php.net/license/3_0.txt}" + +let g:pdv_cfg_ReturnVal = "void" + +" Whether to create @uses tags for implementation of interfaces and inheritance +let g:pdv_cfg_Uses = 1 + +" Options +" :set paste before documenting (1|0)? Recommended. +let g:pdv_cfg_paste = 1 + +" Whether for PHP5 code PHP4 tags should be set, like @access,... (1|0)? +let g:pdv_cfg_php4always = 1 + +" Whether to guess scopes after PEAR coding standards: +" $_foo/_bar() == <private|protected> (1|0)? +let g:pdv_cfg_php4guess = 1 + +" If you selected 1 for the last value, this scope identifier will be used for +" the identifiers having an _ in the first place. +let g:pdv_cfg_php4guessval = "protected" + +" +" Regular expressions +" + +let g:pdv_re_comment = ' *\*/ *' + +" (private|protected|public) +let g:pdv_re_scope = '\(private\|protected\|public\)' +" (static) +let g:pdv_re_static = '\(static\)' +" (abstract) +let g:pdv_re_abstract = '\(abstract\)' +" (final) +let g:pdv_re_final = '\(final\)' + +" [:space:]*(private|protected|public|static|abstract)*[:space:]+[:identifier:]+\([:params:]\) +let g:pdv_re_func = '^\s*\([a-zA-Z ]*\)function\s\+\([^ (]\+\)\s*(\s*\(.*\)\s*)\s*[{;]\?$' +let g:pdv_re_funcend = '^\s*}$' +" [:typehint:]*[:space:]*$[:identifier]\([:space:]*=[:space:]*[:value:]\)? +let g:pdv_re_param = ' *\([^ &]*\) *&\?\$\([A-Za-z_][A-Za-z0-9_]*\) *=\? *\(.*\)\?$' + +" [:space:]*(private|protected|public\)[:space:]*$[:identifier:]+\([:space:]*=[:space:]*[:value:]+\)*; +let g:pdv_re_attribute = '^\s*\(\(private\|public\|protected\|var\|static\)\+\)\s*\$\([^ ;=]\+\)[ =]*\(.*\);\?$' + +" [:spacce:]*(abstract|final|)[:space:]*(class|interface)+[:space:]+\(extends ([:identifier:])\)?[:space:]*\(implements ([:identifier:][, ]*)+\)? +let g:pdv_re_class = '^\s*\([a-zA-Z]*\)\s*\(interface\|class\)\s*\([^ ]\+\)\s*\(extends\)\?\s*\([a-zA-Z0-9]*\)\?\s*\(implements*\)\? *\([a-zA-Z0-9_ ,]*\)\?.*$' + +let g:pdv_re_array = "^array *(.*" +let g:pdv_re_float = '^[0-9.]\+' +let g:pdv_re_int = '^[0-9]\+$' +let g:pdv_re_string = "['\"].*" +let g:pdv_re_bool = "[true false]" + +let g:pdv_re_indent = '^\s*' + +" Shortcuts for editing the text: +let g:pdv_cfg_BOL = "norm! o" +let g:pdv_cfg_EOL = "" + +" }}} + + " {{{ PhpDocSingle() + " Document a single line of code ( does not check if doc block already exists ) + +func! PhpDocSingle() + let l:endline = line(".") + 1 + call PhpDoc() + exe "norm! " . l:endline . "G$" +endfunc + +" }}} + " {{{ PhpDocRange() + " Documents a whole range of code lines ( does not add defualt doc block to + " unknown types of lines ). Skips elements where a docblock is already + " present. +func! PhpDocRange() range + let l:line = a:firstline + let l:endLine = a:lastline + let l:elementName = "" + while l:line <= l:endLine + " TODO: Replace regex check for existing doc with check more lines + " above... + if (getline(l:line) =~ g:pdv_re_func || getline(l:line) =~ g:pdv_re_attribute || getline(l:line) =~ g:pdv_re_class) && getline(l:line - 1) !~ g:pdv_re_comment + let l:docLines = 0 + " Ensure we are on the correct line to run PhpDoc() + exe "norm! " . l:line . "G$" + " No matter what, this returns the element name + let l:elementName = PhpDoc() + let l:endLine = l:endLine + (line(".") - l:line) + 1 + let l:line = line(".") + 1 + endif + let l:line = l:line + 1 + endwhile +endfunc + + " }}} +" {{{ PhpDocFold() + +" func! PhpDocFold(name) +" let l:startline = line(".") +" let l:currentLine = l:startLine +" let l:commentHead = escape(g:pdv_cfg_CommentHead, "*."); +" let l:txtBOL = g:pdv_cfg_BOL . matchstr(l:name, '^\s*') +" " Search above for comment start +" while (l:currentLine > 1) +" if (matchstr(l:commentHead, getline(l:currentLine))) +" break; +" endif +" let l:currentLine = l:currentLine + 1 +" endwhile +" " Goto 1 line above and open a newline +" exe "norm! " . (l:currentLine - 1) . "Go\<ESC>" +" " Write the fold comment +" exe l:txtBOL . g:pdv_cfg_CommentSingle . " {"."{{ " . a:name . g:pdv_cfg_EOL +" " Add another newline below that +" exe "norm! o\<ESC>" +" " Search for our comment line +" let l:currentLine = line(".") +" while (l:currentLine <= line("$")) +" " HERE!!!! +" endwhile +" +" +" endfunc + + +" }}} + +" {{{ PhpDoc() + +func! PhpDoc() + " Needed for my .vimrc: Switch off all other enhancements while generating docs + let l:paste = &g:paste + let &g:paste = g:pdv_cfg_paste == 1 ? 1 : &g:paste + + let l:line = getline(".") + let l:result = "" + + if l:line =~ g:pdv_re_func + let l:result = PhpDocFunc() + + elseif l:line =~ g:pdv_re_funcend + let l:result = PhpDocFuncEnd() + + elseif l:line =~ g:pdv_re_attribute + let l:result = PhpDocVar() + + elseif l:line =~ g:pdv_re_class + let l:result = PhpDocClass() + + else + let l:result = PhpDocDefault() + + endif + +" if g:pdv_cfg_folds == 1 +" PhpDocFolds(l:result) +" endif + + let &g:paste = l:paste + + return l:result +endfunc + +" }}} + +" {{{ PhpDocFuncEnd() +func! PhpDocFuncEnd() + + call append(line('.'), matchstr(getline('.'), '^\s*') . g:pdv_cfg_CommentEnd) +endfunc +" }}} +" {{{ PhpDocFuncEndAuto() +func! PhpDocFuncEndAuto() + + + call search('{') + call searchpair('{', '', '}') + call append(line('.'), matchstr(getline('.'), '^\s*') . g:pdv_cfg_CommentEnd) + +endfunc +" }}} + +" {{{ PhpDocFunc() + +func! PhpDocFunc() + " Line for the comment to begin + let commentline = line (".") - 1 + + let l:name = substitute (getline ("."), '^\(.*\)\/\/.*$', '\1', "") + + "exe g:pdv_cfg_BOL . "DEBUG:" . name. g:pdv_cfg_EOL + + " First some things to make it more easy for us: + " tab -> space && space+ -> space + " let l:name = substitute (l:name, '\t', ' ', "") + " Orphan. We're now using \s everywhere... + + " Now we have to split DECL in three parts: + " \[(skopemodifier\)]\(funcname\)\(parameters\) + let l:indent = matchstr(l:name, g:pdv_re_indent) + + let l:modifier = substitute (l:name, g:pdv_re_func, '\1', "g") + let l:funcname = substitute (l:name, g:pdv_re_func, '\2', "g") + let l:parameters = substitute (l:name, g:pdv_re_func, '\3', "g") . "," + let l:params = substitute (l:name, g:pdv_re_func, '\3', "g") + let l:sparams = substitute (l:params, '[$ ]', '', "g") + let l:scope = PhpDocScope(l:modifier, l:funcname) + let l:static = g:pdv_cfg_php4always == 1 ? matchstr(l:modifier, g:pdv_re_static) : "" + let l:abstract = g:pdv_cfg_php4always == 1 ? matchstr(l:modifier, g:pdv_re_abstract) : "" + let l:final = g:pdv_cfg_php4always == 1 ? matchstr(l:modifier, g:pdv_re_final) : "" + + exe "norm! " . commentline . "G$" + + " Local indent + let l:txtBOL = g:pdv_cfg_BOL . l:indent + + exec l:txtBOL . "/* " . l:scope ." ". funcname . "(" . l:params . ") {{" . "{ */ " . g:pdv_cfg_EOL + + exe l:txtBOL . g:pdv_cfg_CommentHead . g:pdv_cfg_EOL + " added folding + exe l:txtBOL . g:pdv_cfg_Comment1 . funcname . g:pdv_cfg_EOL + exe l:txtBOL . g:pdv_cfg_Commentn . g:pdv_cfg_EOL + + while (l:parameters != ",") && (l:parameters != "") + " Save 1st parameter + let _p = substitute (l:parameters, '\([^,]*\) *, *\(.*\)', '\1', "") + " Remove this one from list + let l:parameters = substitute (l:parameters, '\([^,]*\) *, *\(.*\)', '\2', "") + " PHP5 type hint? + let l:paramtype = substitute (_p, g:pdv_re_param, '\1', "") + " Parameter name + let l:paramname = substitute (_p, g:pdv_re_param, '\2', "") + " Parameter default + let l:paramdefault = substitute (_p, g:pdv_re_param, '\3', "") + + if l:paramtype == "" + let l:paramtype = PhpDocType(l:paramdefault) + endif + + if l:paramtype != "" + let l:paramtype = " " . l:paramtype + endif + exe l:txtBOL . g:pdv_cfg_Commentn . "@param" . l:paramtype . " $" . l:paramname . " " . g:pdv_cfg_EOL + endwhile + + if l:static != "" + exe l:txtBOL . g:pdv_cfg_Commentn . "@static" . g:pdv_cfg_EOL + endif + if l:abstract != "" + exe l:txtBOL . g:pdv_cfg_Commentn . "@abstract" . g:pdv_cfg_EOL + endif + if l:final != "" + exe l:txtBOL . g:pdv_cfg_Commentn . "@final" . g:pdv_cfg_EOL + endif + if l:scope != "" + exe l:txtBOL . g:pdv_cfg_Commentn . "@access " . l:scope . g:pdv_cfg_EOL + endif + exe l:txtBOL . g:pdv_cfg_Commentn . "@return " . g:pdv_cfg_ReturnVal . g:pdv_cfg_EOL + + " Close the comment block. + exe l:txtBOL . g:pdv_cfg_CommentTail . g:pdv_cfg_EOL + + return l:modifier ." ". l:funcname . PhpDocFuncEndAuto() +endfunc + +" }}} + " {{{ PhpDocVar() + +func! PhpDocVar() + " Line for the comment to begin + let commentline = line (".") - 1 + + let l:name = substitute (getline ("."), '^\(.*\)\/\/.*$', '\1', "") + + " Now we have to split DECL in three parts: + " \[(skopemodifier\)]\(funcname\)\(parameters\) + " let l:name = substitute (l:name, '\t', ' ', "") + " Orphan. We're now using \s everywhere... + + let l:indent = matchstr(l:name, g:pdv_re_indent) + + let l:modifier = substitute (l:name, g:pdv_re_attribute, '\1', "g") + let l:varname = substitute (l:name, g:pdv_re_attribute, '\3', "g") + let l:default = substitute (l:name, g:pdv_re_attribute, '\4', "g") + let l:scope = PhpDocScope(l:modifier, l:varname) + + let l:static = g:pdv_cfg_php4always == 1 ? matchstr(l:modifier, g:pdv_re_static) : "" + + let l:type = PhpDocType(l:default) + + exe "norm! " . commentline . "G$" + + " Local indent + let l:txtBOL = g:pdv_cfg_BOL . l:indent + + exe l:txtBOL . g:pdv_cfg_CommentHead . g:pdv_cfg_EOL + exe l:txtBOL . g:pdv_cfg_Comment1 . l:varname . " " . g:pdv_cfg_EOL + exe l:txtBOL . g:pdv_cfg_Commentn . g:pdv_cfg_EOL + if l:static != "" + exe l:txtBOL . g:pdv_cfg_Commentn . "@static" . g:pdv_cfg_EOL + endif + exe l:txtBOL . g:pdv_cfg_Commentn . "@var " . l:type . g:pdv_cfg_EOL + if l:scope != "" + exe l:txtBOL . g:pdv_cfg_Commentn . "@access " . l:scope . g:pdv_cfg_EOL + endif + + " Close the comment block. + exe l:txtBOL . g:pdv_cfg_CommentTail . g:pdv_cfg_EOL + return l:modifier ." ". l:varname +endfunc + +" }}} +" {{{ PhpDocClass() + +func! PhpDocClass() + " Line for the comment to begin + let commentline = line (".") - 1 + + let l:name = substitute (getline ("."), '^\(.*\)\/\/.*$', '\1', "") + + "exe g:pdv_cfg_BOL . "DEBUG:" . name. g:pdv_cfg_EOL + + " First some things to make it more easy for us: + " tab -> space && space+ -> space + " let l:name = substitute (l:name, '\t', ' ', "") + " Orphan. We're now using \s everywhere... + + " Now we have to split DECL in three parts: + " \[(skopemodifier\)]\(classname\)\(parameters\) + let l:indent = matchstr(l:name, g:pdv_re_indent) + + let l:modifier = substitute (l:name, g:pdv_re_class, '\1', "g") + let l:classname = substitute (l:name, g:pdv_re_class, '\3', "g") + let l:extends = g:pdv_cfg_Uses == 1 ? substitute (l:name, g:pdv_re_class, '\5', "g") : "" + let l:interfaces = g:pdv_cfg_Uses == 1 ? substitute (l:name, g:pdv_re_class, '\7', "g") . "," : "" + + let l:abstract = g:pdv_cfg_php4always == 1 ? matchstr(l:modifier, g:pdv_re_abstract) : "" + let l:final = g:pdv_cfg_php4always == 1 ? matchstr(l:modifier, g:pdv_re_final) : "" + + exe "norm! " . commentline . "G$" + + " Local indent + let l:txtBOL = g:pdv_cfg_BOL . l:indent + + exe l:txtBOL . g:pdv_cfg_CommentHead . g:pdv_cfg_EOL + exe l:txtBOL . g:pdv_cfg_Comment1 . l:classname . " " . g:pdv_cfg_EOL + exe l:txtBOL . g:pdv_cfg_Commentn . g:pdv_cfg_EOL + if l:extends != "" && l:extends != "implements" + exe l:txtBOL . g:pdv_cfg_Commentn . "@uses " . l:extends . g:pdv_cfg_EOL + endif + + while (l:interfaces != ",") && (l:interfaces != "") + " Save 1st parameter + let interface = substitute (l:interfaces, '\([^, ]*\) *, *\(.*\)', '\1', "") + " Remove this one from list + let l:interfaces = substitute (l:interfaces, '\([^, ]*\) *, *\(.*\)', '\2', "") + exe l:txtBOL . g:pdv_cfg_Commentn . "@uses " . l:interface . g:pdv_cfg_EOL + endwhile + + if l:abstract != "" + exe l:txtBOL . g:pdv_cfg_Commentn . "@abstract" . g:pdv_cfg_EOL + endif + if l:final != "" + exe l:txtBOL . g:pdv_cfg_Commentn . "@final" . g:pdv_cfg_EOL + endif + exe l:txtBOL . g:pdv_cfg_Commentn . "@package " . g:pdv_cfg_Package . g:pdv_cfg_EOL + exe l:txtBOL . g:pdv_cfg_Commentn . "@version " . g:pdv_cfg_Version . g:pdv_cfg_EOL + exe l:txtBOL . g:pdv_cfg_Commentn . "@copyright " . g:pdv_cfg_Copyright . g:pdv_cfg_EOL + exe l:txtBOL . g:pdv_cfg_Commentn . "@author " . g:pdv_cfg_Author g:pdv_cfg_EOL + exe l:txtBOL . g:pdv_cfg_Commentn . "@license " . g:pdv_cfg_License . g:pdv_cfg_EOL + + " Close the comment block. + exe l:txtBOL . g:pdv_cfg_CommentTail . g:pdv_cfg_EOL + return l:modifier ." ". l:classname +endfunc + +" }}} +" {{{ PhpDocScope() + +func! PhpDocScope(modifiers, identifier) +" exe g:pdv_cfg_BOL . DEBUG: . a:modifiers . g:pdv_cfg_EOL + let l:scope = "" + if matchstr (a:modifiers, g:pdv_re_scope) != "" + if g:pdv_cfg_php4always == 1 + let l:scope = matchstr (a:modifiers, g:pdv_re_scope) + else + let l:scope = "x" + endif + endif + if l:scope =~ "^\s*$" && g:pdv_cfg_php4guess + if a:identifier[0] == "_" + let l:scope = g:pdv_cfg_php4guessval + else + let l:scope = "public" + endif + endif + return l:scope != "x" ? l:scope : "" +endfunc + +" }}} +" {{{ PhpDocType() + +func! PhpDocType(typeString) + let l:type = "" + if a:typeString =~ g:pdv_re_array + let l:type = "array" + endif + if a:typeString =~ g:pdv_re_float + let l:type = "float" + endif + if a:typeString =~ g:pdv_re_int + let l:type = "int" + endif + if a:typeString =~ g:pdv_re_string + let l:type = "string" + endif + if a:typeString =~ g:pdv_re_bool + let l:type = "bool" + endif + if l:type == "" + let l:type = g:pdv_cfg_Type + endif + return l:type +endfunc + +" }}} +" {{{ PhpDocDefault() + +func! PhpDocDefault() + " Line for the comment to begin + let commentline = line (".") - 1 + + let l:indent = matchstr(getline("."), '^\ *') + + exe "norm! " . commentline . "G$" + + " Local indent + let l:txtBOL = g:pdv_cfg_BOL . indent + + exe l:txtBOL . g:pdv_cfg_CommentHead . g:pdv_cfg_EOL + exe l:txtBOL . g:pdv_cfg_Commentn . " " . g:pdv_cfg_EOL + + " Close the comment block. + exe l:txtBOL . g:pdv_cfg_CommentTail . g:pdv_cfg_EOL +endfunc + +" }}} + +endif " user_commands |