diff options
| author | Adam Stankiewicz <sheerun@sher.pl> | 2013-09-14 18:11:57 +0200 | 
|---|---|---|
| committer | Adam Stankiewicz <sheerun@sher.pl> | 2013-09-14 18:12:31 +0200 | 
| commit | 06c80c676e3b0fb7b8f8a80cabd02cefff0c51a8 (patch) | |
| tree | 541455e2f9c7ca053dfd309a1269cb39b1269d2d /indent | |
| parent | b061a2d99500a2aa3da9dae590ccc0c20edf6eb9 (diff) | |
| download | vim-polyglot-06c80c676e3b0fb7b8f8a80cabd02cefff0c51a8.tar.gz vim-polyglot-06c80c676e3b0fb7b8f8a80cabd02cefff0c51a8.zip | |
Switch to StanAngeloff/php.vim as spf13/PIV relies on plugin stuff, fixes #4
Diffstat (limited to 'indent')
| -rw-r--r-- | indent/php.vim | 1269 | 
1 files changed, 0 insertions, 1269 deletions
| diff --git a/indent/php.vim b/indent/php.vim deleted file mode 100644 index 6286c6b3..00000000 --- a/indent/php.vim +++ /dev/null @@ -1,1269 +0,0 @@ -" Vim indent file -" Language:	PHP -" Author:	John Wellesz <John.wellesz (AT) teaser (DOT) fr> -" URL:		http://www.2072productions.com/vim/indent/php.vim -" Last Change:	2010 July 26th -" Newsletter:	http://www.2072productions.com/?to=php-indent-for-vim-newsletter.php -" Version:	1.33 -" -" -" Changes: 1.33		- Rewrote Switch(){case:default:} handling from -"			  scratch in a simpler more logical and infallible way... -"			- Removed PHP_ANSI_indenting which is no longer -"		 	  needed. -" -" -" Changes: 1.32b	- Added PHP_ANSI_indenting and PHP_outdentphpescape -"			  options details to VIm documentation (:help php-indent). -" -" -" Changes: 1.32		- Added a new option: PHP_ANSI_indenting -" -" -" Changes: 1.31a	- Added a new option: PHP_outdentphpescape to indent -"			  PHP tags as the surrounding code. -" -" Changes: 1.30		- Fixed empty case/default indentation again :/ -"			- The ResetOptions() function will be called each time -"			  the ftplugin calls this script, previously it was -"			  executed on BufWinEnter and Syntax events. -" -" -" Changes: 1.29		- Fixed php file detection for ResetOptions() used for -"			  comments formatting. It now uses the same tests as -"			  filetype.vim. ResetOptions() will be correctly -"			  called for *.phtml, *.ctp and *.inc files. -" -" -" Changes: 1.28		- End HEREDOC delimiters were not considered as such -"			  if they were not followed by a ';'. -"			- Added support for NOWDOC tags ($foo = <<<'bar') -" -" -" Changes: 1.27		- if a "case" was preceded by another "case" on the -"			  previous line, the second "case" was indented incorrectly. -" -" Changes: 1.26		- '/*' character sequences found on a line -"			  starting by a '#' were not dismissed by the indenting algorithm -"			  and could cause indentation problem in some cases. -" -" -" Changes: 1.25		- Fix some indentation errors on multi line conditions -"			  and multi line statements. -"			- Fix when array indenting is broken and a closing -"			');' is placed at the start of the line, following -"			lines will be indented correctly. -"			- New option: PHP_vintage_case_default_indent (default off) -"			- Minor fixes and optimizations. -" -" -" Changes: 1.24		- Added compatibility with the latest version of -"			  php.vim syntax file by Peter Hodge (http://www.vim.org/scripts/script.php?script_id=1571) -"			  This fixes wrong indentation and ultra-slow indenting -"			  on large php files... -"			- Fixed spelling in comments. -" -" -" Changes: 1.23		- <script> html tags are now correctly indented the same -"			  way their content is. -"			- <?.*?> (on a single line) PHP declarations are now -"			  always considered as non-PHP code and let untouched. -" -" Changes: 1.22		- PHPDoc comments are now indented according to the -"			  surrounding code. -"			- This is also true for '/* */' multi-line comments -"			  when the second line begins by a '*'. -"			- Single line '/* */' comments are also indented. -" -" -" Changes: 1.21		- 'try' and 'catch' were not registered as block starters so the '{' -"			  after a 'try' or 'catch' could be wrongly indented... -"			  (thanks to Gert Muller for finding this issue) -" -" Changes: 1.20		- Line beginning by a single or double quote followed -"			  by a space would cause problems... this was related -"			  to the bug correction of version 1.10 - Thanks to -"			  David Fishburn for finding this (he was lucky). -"			- Changed the way this script set the 'formatoptions' -"			  setting, now it uses '-=' and '+=' -"			- New option: PHP_autoformatcomment (defaults to 1), -"			  if set to 0 the 'formatoptions' setting will not be -"			  altered. -"			- When PHP_autoformatcomment is not 0, the 'comments' -"			  setting is set to the type of comments that PHP -"			  supports. -" -" Changes: 1.19		- Indentation of '*/' delimiter of '/**/' won't be broken by -"			  strings or '//' comments containing the "/*" character sequence. -" -" Changes: 1.182	- I Forgot to register 'interface' and 'abstract' as block starters so the '{' -"			  after them could be wrongly indented... -" -" Changes: 1.181	- I Forgot to register 'class' as a block starter so the '{' -"			  after a 'class' could be wrongly indented... -" -" Changes: 1.18		- No more problems with Vim 6.3 and UTF-8. -"			- Opening braces "{" are always indented according to their block starter. -" -"				Instead of: -" -"					if( $test -"					    && $test2 ) -"					    { -"					    } -" -"				You have: -" -"					if( $test -"					    && $test2 ) -"					{ -"					} -" -" -" Changes: 1.17		- Now following parts of split lines are indented: -" -"				Instead of: -" -"					$foo= -"					"foo" -"					."foo"; -" -"				You have: -" -"					$foo= -"					    "foo" -"					    ."foo"; -" -"			- If a "case : break;" was declared on a single line, the -"			  following "case" was not indented correctly. -"			- If a </script> html tag was preceded by a "?>" it wasn't indented. -"			- Some other minor corrections and improvements. -" -" -" Changes: 1.16		- Now starting and ending '*' of multiline '/* */' comments are aligned -"			  on the '*' of the '/*' comment starter. -"			- Some code improvements that make indentation faster. -" -" Changes: 1.15		- Corrected some problems with the indentation of -"			  multiline "array()" declarations. -" -" Changes: 1.14		- Added auto-formatting for comments (using the Vim option formatoptions=qroc). -"			- Added the script option PHP_BracesAtCodeLevel to -"			  indent the '{' and '}' at the same level than the -"			  code they contain. -" -" Changes: 1.13		- Some code cleaning and typo corrections (Thanks to -"			  Emanuele Giaquinta for his patches) -" -" Changes: 1.12		- The bug involving searchpair() and utf-8 encoding in Vim 6.3 will -"			  not make this script to hang but you'll have to be -"			  careful to not write '/* */' comments with other '/*' -"			  inside the comments else the indentation won't be correct. -"			  NOTE: This is true only if you are using utf-8 and vim 6.3. -" -" Changes: 1.11		- If the "case" of a "switch" wasn't alone on its line -"			  and if the "switch" was at col 0 (or at default indenting) -"			  the lines following the "case" were not indented. -" -" Changes: 1.10		- Lines beginning by a single or double quote were -"			  not indented in some cases. -" -" Changes: 1.09		- JavaScript code was not always directly indented. -" -" Changes: 1.08		- End comment tags '*/' are indented like start tags '/*'. -"			- When typing a multiline comment, '}' are indented -"			  according to other commented '{'. -"			- Added a new option 'PHP_removeCRwhenUnix' to -"			  automatically remove CR at end of lines when the file -"			  format is Unix. -"			- Changed the file format of this very file to Unix. -"			- This version seems to correct several issues some people -"			  had with 1.07. -" -" Changes: 1.07		- Added support for "Here document" tags: -"			   - HereDoc end tags are indented properly. -"			   - HereDoc content remains unchanged. -"			- All the code that is outside PHP delimiters remains -"			  unchanged. -"			- New feature: The content of <script.*> html tags is considered as PHP -"			  and indented according to the surrounding PHP code. -"			- "else if" are detected as "elseif". -"			- Multiline /**/ are indented when the user types it but -"			  remain unchanged when indenting from their beginning. -"			- Fixed indenting of // and # comments. -"			- php_sync_method option is set to 0 (fromstart). -"			  This is required for complex PHP scripts else the indent -"			  may fail. -"			- Files with non PHP code at the beginning could alter the indent -"			  of the following PHP code. -"			- Other minor improvements and corrections. -" -" Changes: 1.06:    - Switch block were no longer indented correctly... -"		    - Added an option to use a default indenting instead of 0. -"		      (whereas I still can't find any good reason to use it!) -"		    - A problem with ^\s*);\= lines where ending a non '{}' -"		      structure. -"		    - Changed script local variable to be buffer local -"		      variable instead. -" -" Changes: 1.05:    - Lines containing "<?php ?>" and "?> <?php" -"		      (start and end tag on the same line) are no -"		      longer indented at col 1 but as normal code. -" -" Changes: 1.04:    - Strings containing "//" could break the indenting -"		      algorithm. -"		    - When a '{}' block was at col 1, the second line of the -"		      block was not indented at all (because of a stupid -"		      optimization coupled with a bug). -" -" Changes: 1.03:    - Some indenting problems corrected: end of non '{}' -"		      structures was not detected in some cases. The part of -"		      code concerned have been re-written -"		    - PHP start tags were not indented at col 1 -"		    - Wrong comment in the code have been corrected -" -" Changes: 1.02:    - The bug I was talking about in version 1.01 (right below) has -"		      been corrected :) -"		    - Also corrected another bug that could occur in -"		      some special cases. -"		    - I removed the debug mode left in 1.01 that could -"		      cause some Vim messages at loading if other script were -"		      bugged. -" -" Changes: 1.01:    - Some little bug corrections regarding automatic optimized -"		      mode that missed some tests and could break the indenting. -"		    - There is also a problem with complex non bracketed structures, when several -"		      else are following each other, the algorithm do not indent the way it -"		      should. -"		      That will be corrected in the next version. -" -"  If you find a bug, please e-mail me at John.wellesz (AT) teaser (DOT) fr -"  with an example of code that breaks the algorithm. -" -" -"	Thanks a lot for using this script. -" - -" NOTE: This script must be used with PHP syntax ON and with the php syntax -"	script by Lutz Eymers (http://www.isp.de/data/php.vim ) or with the -"	script by Peter Hodge (http://www.vim.org/scripts/script.php?script_id=1571 ) -"	the later is bundled by default with Vim 7. -" -" -"	In the case you have syntax errors in your script such as HereDoc end -"	identifiers not at col 1 you'll have to indent your file 2 times (This -"	script will automatically put HereDoc end identifiers at col 1 if -"	they are followed by a ';'). -" - -" NOTE: If you are editing files in Unix file format and that (by accident) -"	there are '\r' before new lines, this script won't be able to proceed -"	correctly and will make many mistakes because it won't be able to match -"	'\s*$' correctly. -"	So you have to remove those useless characters first with a command like: -" -"	:%s /\r$//g -" -"	or simply 'let' the option PHP_removeCRwhenUnix to 1 and the script will -"	silently remove them when VIM load this script (at each bufread). -" -" -" Options: PHP_autoformatcomment = 0 to not enable autoformating of comment by -"		    default, if set to 0, this script will let the 'formatoptions' setting intact. -" -" Options: PHP_default_indenting = # of sw (default is 0), # of sw will be -"		   added to the indent of each line of PHP code. -" -" Options: PHP_removeCRwhenUnix = 1 to make the script automatically remove CR -"		   at end of lines (by default this option is unset), NOTE that you -"		   MUST remove CR when the fileformat is UNIX else the indentation -"		   won't be correct! -" -" Options: PHP_BracesAtCodeLevel = 1 to indent the '{' and '}' at the same -"		   level than the code they contain. -"		   Exemple: -"			Instead of: -"				if ($foo) -"				{ -"					foo(); -"				} -" -"			You will write: -"				if ($foo) -"					{ -"					foo(); -"					} -" -"			NOTE: The script will be a bit slower if you use this option because -"			some optimizations won't be available. -" -" -" Options: PHP_outdentphpescape = 0 (defaults to 1) to indent PHP tags as the surrounding code. -" -" Options: PHP_vintage_case_default_indent = 1 (defaults to 0) to add a meaningless indent -"		    befaore 'case:' and 'default":' statement in switch blocks. -" -" -" Remove all the comments from this file: -" :%s /^\s*".*\({{{\|xxx\)\@<!\n\c//g -" }}} - -" The 4 following lines prevent this script from being loaded several times per buffer. -" They also prevent the load of different indent scripts for PHP at the same time. -if exists("b:did_indent") -    finish -endif -let b:did_indent = 1 - -"	This script set the option php_sync_method of PHP syntax script to 0 -"	(fromstart indenting method) in order to have an accurate syntax. -"	If you are using very big PHP files (which is a bad idea) you will -"	experience slowings down while editing, if your code contains only PHP -"	code you can comment the line below. - -let php_sync_method = 0 - - -" Apply PHP_default_indenting option -if exists("PHP_default_indenting") -    let b:PHP_default_indenting = PHP_default_indenting * &sw -else -    let b:PHP_default_indenting = 0 -endif - -if exists("PHP_BracesAtCodeLevel") -    let b:PHP_BracesAtCodeLevel = PHP_BracesAtCodeLevel -else -    let b:PHP_BracesAtCodeLevel = 0 -endif - - -if exists("PHP_autoformatcomment") -    let b:PHP_autoformatcomment = PHP_autoformatcomment -else -    let b:PHP_autoformatcomment = 1 -endif - -if exists("PHP_outdentphpescape") -    let b:PHP_outdentphpescape = PHP_outdentphpescape -else -    let b:PHP_outdentphpescape = 1 -endif - - -if exists("PHP_vintage_case_default_indent") && PHP_vintage_case_default_indent -    let b:PHP_vintage_case_default_indent = 1 -else -    let b:PHP_vintage_case_default_indent = 0 -endif - - - -let b:PHP_lastindented = 0 -let b:PHP_indentbeforelast = 0 -let b:PHP_indentinghuge = 0 -let b:PHP_CurrentIndentLevel = b:PHP_default_indenting -let b:PHP_LastIndentedWasComment = 0 -let b:PHP_InsideMultilineComment = 0 -" PHP code detect variables -let b:InPHPcode = 0 -let b:InPHPcode_checked = 0 -let b:InPHPcode_and_script = 0 -let b:InPHPcode_tofind = "" -let b:PHP_oldchangetick = b:changedtick -let b:UserIsTypingComment = 0 -let b:optionsset = 0 - -" The 4 options belows are overridden by indentexpr so they are always off -" anyway... -setlocal nosmartindent -setlocal noautoindent -setlocal nocindent -" autoindent must be on, so the line below is also useless... -setlocal nolisp - -setlocal indentexpr=GetPhpIndent() -setlocal indentkeys=0{,0},0),:,!^F,o,O,e,*<Return>,=?>,=<?,=*/ - - - -let s:searchpairflags = 'bWr' - -" Clean CR when the file is in Unix format -if &fileformat == "unix" && exists("PHP_removeCRwhenUnix") && PHP_removeCRwhenUnix -    silent! %s/\r$//g -endif - -" Only define the functions once per Vim session. -if exists("*GetPhpIndent") -    call ResetPhpOptions() -    finish " XXX -- comment this line for easy dev -endif - -let s:endline= '\s*\%(//.*\|#.*\|/\*.*\*/\s*\)\=$' -let s:PHP_startindenttag = '<?\%(.*?>\)\@!\|<script[^>]*>\%(.*<\/script>\)\@!' -"setlocal debug=msg " XXX -- do not comment this line when modifying this file - - -function! GetLastRealCodeLNum(startline) " {{{ -    "Inspired from the function SkipJavaBlanksAndComments by Toby Allsopp for indent/java.vim - -    let lnum = a:startline - -    " Used to indent <script.*> html tag correctly -    if b:GetLastRealCodeLNum_ADD && b:GetLastRealCodeLNum_ADD == lnum + 1 -	let lnum = b:GetLastRealCodeLNum_ADD -    endif - -    let old_lnum = lnum - -    while lnum > 1 -	let lnum = prevnonblank(lnum) -	let lastline = getline(lnum) - -	" if we are inside an html <script> we must skip ?> tags to indent -	" everything as php -	if b:InPHPcode_and_script && lastline =~ '?>\s*$' -	    let lnum = lnum - 1 -	elseif lastline =~ '^\s*?>.*<?\%(php\)\=\s*$' -	    let lnum = lnum - 1 -	elseif lastline =~ '^\s*\%(//\|#\|/\*.*\*/\s*$\)' -	    " if line is under comment -	    let lnum = lnum - 1 -	elseif lastline =~ '\*/\s*$' -	    " skip multiline comments -	    call cursor(lnum, 1) -	    if lastline !~ '^\*/' -		call search('\*/', 'W') -		" position the cursor on the first */ -	    endif -	    let lnum = searchpair('/\*', '', '\*/', s:searchpairflags, 'Skippmatch2()') -	    " find the most outside /* - -	    let lastline = getline(lnum) -	    if lastline =~ '^\s*/\*' -		" if line contains nothing but comment -		" do the job again on the line before (a comment can hide another...) -		let lnum = lnum - 1 -	    else -		break -	    endif - - -	elseif lastline =~? '\%(//\s*\|?>.*\)\@<!<?\%(php\)\=\s*$\|^\s*<script\>' -	    " skip non php code - -	    while lastline !~ '\(<?.*\)\@<!?>' && lnum > 1 -		let lnum = lnum - 1 -		let lastline = getline(lnum) -	    endwhile -	    if lastline =~ '^\s*?>' -		" if line contains nothing but end tag -		let lnum = lnum - 1 -	    else -		break -		" else there is something important before the ?> -	    endif - - -	    " Manage "here document" tags -	elseif lastline =~? '^\a\w*;\=$' && lastline !~? s:notPhpHereDoc -	    " match the end of a heredoc -	    let tofind=substitute( lastline, '\(\a\w*\);\=', '<<<''\\=\1''\\=$', '') -	    while getline(lnum) !~? tofind && lnum > 1 -		let lnum = lnum - 1 -	    endwhile -	else -	    " if none of these were true then we are done -	    break -	endif -    endwhile - -    if lnum==1 && getline(lnum) !~ '<?' -	let lnum=0 -    endif - -    " This is to handle correctly end of script tags; to return the real last php -    " code line else a '?>' could be returned has last_line -    if b:InPHPcode_and_script && !b:InPHPcode -	let b:InPHPcode_and_script = 0 -    endif - -    "echom lnum -    "call getchar() - - -    return lnum -endfunction " }}} - -function! Skippmatch2() - -    let line = getline(".") - -   if line =~ '\%(".*\)\@<=/\*\%(.*"\)\@=' || line =~ '\%(\%(//\|#\).*\)\@<=/\*' -       return 1 -   else -       return 0 -   endif -endfun - -function! Skippmatch()	" {{{ -    " the slowest instruction of this script, remove it and the script is 3 -    " times faster but you may have troubles with '{' inside comments or strings -    " that will break the indent algorithm... -    let synname = synIDattr(synID(line("."), col("."), 0), "name") -    if synname == "Delimiter" || synname == "phpRegionDelimiter" || synname =~# "^phpParent" || synname == "phpArrayParens" || synname =~# '^php\%(Block\|Brace\)' || synname == "javaScriptBraces" || synname =~# "^phpComment" && b:UserIsTypingComment -	return 0 -    else -"	echo "\"" . synname . "\"  " . getline(line(".")); -"	call getchar() -	return 1 -    endif -endfun " }}} - -function! FindOpenBracket(lnum) " {{{ -    " set the cursor to the start of the lnum line -    call cursor(a:lnum, 1) -    return searchpair('{', '', '}', 'bW', 'Skippmatch()') -endfun " }}} - -function! FindTheIfOfAnElse (lnum, StopAfterFirstPrevElse) " {{{ -    " A very clever recoursive function created by me (John Wellesz) that find the "if" corresponding to an -    " "else". This function can easily be adapted for other languages :) -    " 2010-07-25 -- Wow! it seems I was very proud of myself, I wouldn't write -    " such a comment nowadays. - -    if getline(a:lnum) =~# '^\s*}\s*else\%(if\)\=\>' -	" we do this so we can find the opened bracket to speed up the process -	let beforeelse = a:lnum -    else -	let beforeelse = GetLastRealCodeLNum(a:lnum - 1) -    endif - -    if !s:level -	let s:iftoskip = 0 -    endif - -    " If we've found another "else" then it means we need to skip the next "if" -    " we'll find. -    if getline(beforeelse) =~# '^\s*\%(}\s*\)\=else\%(\s*if\)\@!\>' -	let s:iftoskip = s:iftoskip + 1 -    endif - -    " A closing bracket? let skip the whole block to save some recursive calls -    if getline(beforeelse) =~ '^\s*}' -	let beforeelse = FindOpenBracket(beforeelse) - -	" Put us on the block starter -	if getline(beforeelse) =~ '^\s*{' -	    let beforeelse = GetLastRealCodeLNum(beforeelse - 1) -	endif -    endif - - -    " sometimes it's not useful to find the very first if of a long if elseif -    " chain. The previous elseif will be enough -    if !s:iftoskip && a:StopAfterFirstPrevElse && getline(beforeelse) =~# '^\s*\%([}]\s*\)\=else\%(if\)\=\>' -	return beforeelse -    endif - -    " if there was an else, then there is a if... -    if getline(beforeelse) !~# '^\s*if\>' && beforeelse>1 || s:iftoskip && beforeelse>1 - -	if s:iftoskip && getline(beforeelse) =~# '^\s*if\>' -	    let s:iftoskip = s:iftoskip - 1 -	endif - -	let s:level =  s:level + 1 -	let beforeelse = FindTheIfOfAnElse(beforeelse, a:StopAfterFirstPrevElse) -    endif - -    return beforeelse - -endfunction " }}} - -let s:defaultORcase = '^\s*\%(default\|case\).*:' - -function! FindTheSwitchIndent (lnum) " {{{ -    " Yes that's right, another very clever recursive function by the -    " author of the famous FindTheIfOfAnElse() - - -    let test = GetLastRealCodeLNum(a:lnum - 1) - -    if test <= 1 -	return indent(1) - &sw * b:PHP_vintage_case_default_indent -    end - -    " A closing bracket? let skip the whole block to save some recursive calls -    if getline(test) =~ '^\s*}' -	let test = FindOpenBracket(test) - -	" Put us on the line above the block starter since if it's a switch, -	" it's not the one we want. -	if getline(test) =~ '^\s*{' -	    let test = GetLastRealCodeLNum(GetLastRealCodeLNum(test - 1) - 1) -	endif -    endif - -    " did we find it? -    if getline(test) =~# '^\s*switch\>' -	return indent(test) -    elseif getline(test) =~# s:defaultORcase -	return indent(test) - &sw * b:PHP_vintage_case_default_indent -    else -	return FindTheSwitchIndent(test) -    endif - -endfunction "}}} - - -function! IslinePHP (lnum, tofind) " {{{ -    " This function asks to the syntax if the pattern 'tofind' on the line -    " number 'lnum' is PHP code (very slow...). -    let cline = getline(a:lnum) - -    if a:tofind=="" -	" This correct the issue where lines beginning by a -	" single or double quote were not indented in some cases. -	let tofind = "^\\s*[\"']*\\s*\\zs\\S" -    else -	let tofind = a:tofind -    endif - -    " ignore case -    let tofind = tofind . '\c' - -    "find the first non blank char in the current line -    let coltotest = match (cline, tofind) + 1 - -    " ask to syntax what is its name -    let synname = synIDattr(synID(a:lnum, coltotest, 0), "name") - -"	echom synname -    " if matchstr(synname, '^...') == "php" || synname=="Delimiter" || synname =~? '^javaScript' -    if synname =~ '^php' || synname=="Delimiter" || synname =~? '^javaScript' -	return synname -    else -	return "" -    endif -endfunction " }}} - -let s:notPhpHereDoc = '\%(break\|return\|continue\|exit\|else\)' -let s:blockstart = '\%(\%(\%(}\s*\)\=else\%(\s\+\)\=\)\=if\>\|else\>\|while\>\|switch\>\|case\>\|default\>\|for\%(each\)\=\>\|declare\>\|class\>\|interface\>\|abstract\>\|try\>\|catch\>\)' - -" make sure the options needed for this script to work correctly are set here -" for the last time. They could have been overridden by any 'onevent' -" associated setting file... -let s:autoresetoptions = 0 -if ! s:autoresetoptions -    "au BufWinEnter,Syntax	*.php,*.php\d,*.phtml,*.ctp,*.inc	call ResetPhpOptions() -    let s:autoresetoptions = 1 -endif - -function! ResetPhpOptions() -    if ! b:optionsset && &filetype == "php"  -	if b:PHP_autoformatcomment - -	    " Set the comment setting to something correct for PHP -	    setlocal comments=s1:/*,mb:*,ex:*/,://,:# - -	    " disable Auto-wrap of text -	    setlocal formatoptions-=t -	    " Allow formatting of comments with "gq" -	    setlocal formatoptions+=q -	    " Insert comment leader after hitting <Enter> -	    setlocal formatoptions+=r -	    " Insert comment leader after hitting o or O in normal mode -	    setlocal formatoptions+=o -	    " Uses trailing white spaces to detect paragraphs -	    setlocal formatoptions+=w -	    " Autowrap comments using textwidth -	    setlocal formatoptions+=c -	    " Do not wrap if you modify a line after textwidth -	    setlocal formatoptions+=b -	endif -	let b:optionsset = 1 -    endif -endfunc - -call ResetPhpOptions() - -function! GetPhpIndent() -    "############################################## -    "########### MAIN INDENT FUNCTION ############# -    "############################################## - -    " variable added on 2005-01-15 to make <script> tags really indent correctly (not pretty at all :-/ ) -    let b:GetLastRealCodeLNum_ADD = 0 - -    " This detect if the user is currently typing text between each call -    let UserIsEditing=0 -    if	b:PHP_oldchangetick != b:changedtick -	let b:PHP_oldchangetick = b:changedtick -	let UserIsEditing=1 -    endif - -    if b:PHP_default_indenting -	let b:PHP_default_indenting = g:PHP_default_indenting * &sw -    endif - -    " current line -    let cline = getline(v:lnum) - -    " Let's detect if we are indenting just one line or more than 3 lines -    " in the last case we can slightly optimize our algorithm (by trusting -    " what is above the current line) -    if !b:PHP_indentinghuge && b:PHP_lastindented > b:PHP_indentbeforelast -	if b:PHP_indentbeforelast -	    let b:PHP_indentinghuge = 1 -	    echom 'Large indenting detected, speed optimizations engaged (v1.33)' -	endif -	let b:PHP_indentbeforelast = b:PHP_lastindented -    endif - -    " If the line we are indenting isn't directly under the previous non-blank -    " line of the file then deactivate the optimization procedures and reset -    " status variable (we restart from scratch) -    if b:InPHPcode_checked && prevnonblank(v:lnum - 1) != b:PHP_lastindented -	if b:PHP_indentinghuge -	    echom 'Large indenting deactivated' -	    let b:PHP_indentinghuge = 0 -	    let b:PHP_CurrentIndentLevel = b:PHP_default_indenting -	endif -	let b:PHP_lastindented = v:lnum -	let b:PHP_LastIndentedWasComment=0 -	let b:PHP_InsideMultilineComment=0 -	let b:PHP_indentbeforelast = 0 - -	let b:InPHPcode = 0 -	let b:InPHPcode_checked = 0 -	let b:InPHPcode_and_script = 0 -	let b:InPHPcode_tofind = "" - -    elseif v:lnum > b:PHP_lastindented -	" we are indenting line in > order (we can rely on the line before) -	let real_PHP_lastindented = b:PHP_lastindented -	let b:PHP_lastindented = v:lnum -    endif - -    " We must detect if we are in PHPCODE or not, but one time only, then -    " we will detect php end and start tags, comments /**/ and HereDoc -    " tags - -    if !b:InPHPcode_checked " {{{ One time check -	let b:InPHPcode_checked = 1 - -	let synname = "" -	if cline !~ '<?.*?>' -	    " the line could be blank (if the user presses 'return' so we use -	    " prevnonblank()) We ask to Syntax -	    let synname = IslinePHP (prevnonblank(v:lnum), "") -	endif - -	if synname!="" -	    if synname != "phpHereDoc" && synname != "phpHereDocDelimiter" -		let b:InPHPcode = 1 -		let b:InPHPcode_tofind = "" - -		if synname =~# "^phpComment" -		    let b:UserIsTypingComment = 1 -		else -		    let b:UserIsTypingComment = 0 -		endif - -		if synname =~? '^javaScript' -		    let b:InPHPcode_and_script = 1 -		endif - -	    else -		"We are inside an "HereDoc" -		let b:InPHPcode = 0 -		let b:UserIsTypingComment = 0 - -		let lnum = v:lnum - 1 -		while getline(lnum) !~? '<<<''\=\a\w*''\=$' && lnum > 1 -		    let lnum = lnum - 1 -		endwhile - -		let b:InPHPcode_tofind = substitute( getline(lnum), '^.*<<<''\=\(\a\w*\)''\=$', '^\\s*\1;\\=$', '') -	    endif -	else -	    " IslinePHP returned "" => we are not in PHP or Javascript -	    let b:InPHPcode = 0 -	    let b:UserIsTypingComment = 0 -	    " Then we have to find a php start tag... -	    let b:InPHPcode_tofind = '<?\%(.*?>\)\@!\|<script.*>' -	endif -    endif "!b:InPHPcode_checked }}} - -    " Now we know where we are so we can verify the line right above the -    " current one to see if we have to stop or restart php indenting - -    " Test if we are indenting PHP code {{{ -    " Find an executable php code line above the current line. -    let lnum = prevnonblank(v:lnum - 1) -    let last_line = getline(lnum) - -    " If we aren't in php code, then there is something we have to find -    if b:InPHPcode_tofind!="" -	if cline =~? b:InPHPcode_tofind -	    let b:InPHPcode = 1 -	    let b:InPHPcode_tofind = "" -	    let b:UserIsTypingComment = 0 -	    if cline =~ '\*/' -		" End comment tags must be indented like start comment tags -		call cursor(v:lnum, 1) -		if cline !~ '^\*/' -		    call search('\*/', 'W') -		endif -		" find the most outside /* -		let lnum = searchpair('/\*', '', '\*/', s:searchpairflags, 'Skippmatch2()') - -		let b:PHP_CurrentIndentLevel = b:PHP_default_indenting - -		" prevent a problem if multiline /**/ comment are surrounded by -		" other types of comments -		let b:PHP_LastIndentedWasComment = 0 - -		if cline =~ '^\s*\*/' -		    return indent(lnum) + 1 -		else -		    return indent(lnum) -		endif - -	    elseif cline =~? '<script\>' -		" a more accurate test is useless since there isn't any other possibility -		let b:InPHPcode_and_script = 1 -		" this will make GetLastRealCodeLNum to add one line to its -		" given argument so it can detect the <script> easily (that is -		" simpler/quicker than using a regex...) -		let b:GetLastRealCodeLNum_ADD = v:lnum -	    endif -	endif -    endif - -    " ### If we are in PHP code, we test the line before to see if we have to stop indenting -    if b:InPHPcode - -	" Was last line containing a PHP end tag ? -	if !b:InPHPcode_and_script && last_line =~ '\%(<?.*\)\@<!?>\%(.*<?\)\@!' && IslinePHP(lnum, '?>')=~"Delimiter" -	    if cline !~? s:PHP_startindenttag -		let b:InPHPcode = 0 -		let b:InPHPcode_tofind = s:PHP_startindenttag -	    elseif cline =~? '<script\>' -		let b:InPHPcode_and_script = 1 -	    endif - -	    " Was last line the start of a HereDoc ? -	elseif last_line =~? '<<<''\=\a\w*''\=$' -	    let b:InPHPcode = 0 -	    let b:InPHPcode_tofind = substitute( last_line, '^.*<<<''\=\(\a\w*\)''\=$', '^\\s*\1;\\=$', '') - -	    " Skip /* \n+ */ comments except when the user is currently -	    " writing them or when it is a comment (ie: not a code put in comment) -	elseif !UserIsEditing && cline =~ '^\s*/\*\%(.*\*/\)\@!' && getline(v:lnum + 1) !~ '^\s*\*' -	    let b:InPHPcode = 0 -	    let b:InPHPcode_tofind = '\*/' - -	    " is current line the end of a HTML script ? (we indent scripts the -	    " same as php code) -	elseif cline =~? '^\s*</script>' -	    let b:InPHPcode = 0 -	    let b:InPHPcode_tofind = s:PHP_startindenttag -	    " Note that b:InPHPcode_and_script is still true so that the -	    " </script> can be indented correctly -	endif -    endif " }}} - - -    " Non PHP code is let as it is -    if !b:InPHPcode && !b:InPHPcode_and_script -	return -1 -    endif - -    " Align correctly multi // or # lines -    " Indent successive // or # comment the same way the first is {{{ -    if cline =~ '^\s*\%(//\|#\|/\*.*\*/\s*$\)' -	if b:PHP_LastIndentedWasComment == 1 -	    return indent(real_PHP_lastindented) -	endif -	let b:PHP_LastIndentedWasComment = 1 -    else -	let b:PHP_LastIndentedWasComment = 0 -    endif " }}} - -    " Indent multiline /* comments correctly {{{ - -    "if we are on the start of a MULTI * beginning comment or if the user is -    "currently typing a /* beginning comment. -    if b:PHP_InsideMultilineComment || b:UserIsTypingComment -	if cline =~ '^\s*\*\%(\/\)\@!' -	    " if cline == '*' -	    if last_line =~ '^\s*/\*' -		" if last_line == '/*' -		return indent(lnum) + 1 -	    else -		return indent(lnum) -	    endif -	else -	    let b:PHP_InsideMultilineComment = 0 -	endif -    endif - -    if !b:PHP_InsideMultilineComment && cline =~ '^\s*/\*' && cline !~ '\*/\s*$' -	" if cline == '/*' and doesn't end with '*/' -	if getline(v:lnum + 1) !~ '^\s*\*' -	    return -1 -	endif -	let b:PHP_InsideMultilineComment = 1 -    endif " }}} - -    " Some tags are always indented to col 1 - -    " Things always indented at col 1 (PHP delimiter: <?, ?>, Heredoc end) {{{ -    " PHP start tags are always at col 1, useless to indent unless the end tag -    " is on the same line -    if cline =~# '^\s*<?' && cline !~ '?>' && b:PHP_outdentphpescape -	return 0 -    endif - -    " PHP end tags are always at col 1, useless to indent unless if it's -    " followed by a start tag on the same line -    if	cline =~ '^\s*?>' && cline !~# '<?' && b:PHP_outdentphpescape -	return 0 -    endif - -    " put HereDoc end tags at start of lines -    if cline =~? '^\s*\a\w*;$\|^\a\w*$' && cline !~? s:notPhpHereDoc -	return 0 -    endif " }}} - -    let s:level = 0 - -    " Find an executable php code line above the current line. -    let lnum = GetLastRealCodeLNum(v:lnum - 1) - -    " last line -    let last_line = getline(lnum) -    " by default -    let ind = indent(lnum) -    let endline= s:endline - -    if ind==0 && b:PHP_default_indenting -	let ind = b:PHP_default_indenting -    endif - -    " Hit the start of the file, use default indent. -    if lnum == 0 -	return b:PHP_default_indenting -    endif - - -    " Search the matching open bracket (with searchpair()) and set the indent of cline -    " to the indent of the matching line. (unless it's a VIm folding end tag) -    if cline =~ '^\s*}\%(}}\)\@!' -	let ind = indent(FindOpenBracket(v:lnum)) -	let b:PHP_CurrentIndentLevel = b:PHP_default_indenting -	return ind -    endif - -    " Check for end of comment and indent it like its beginning -    if cline =~ '^\s*\*/' -	" End comment tags must be indented like start comment tags -	call cursor(v:lnum, 1) -	if cline !~ '^\*/' -	    call search('\*/', 'W') -	endif -	" find the most outside /* -	let lnum = searchpair('/\*', '', '\*/', s:searchpairflags, 'Skippmatch2()') - -	let b:PHP_CurrentIndentLevel = b:PHP_default_indenting - -	if cline =~ '^\s*\*/' -	    return indent(lnum) + 1 -	else -	    return indent(lnum) -	endif -    endif - - -    " if the last line is a stated line and it's not indented then why should -    " we indent this one?? -    " Do not do this if the last line is a ')' because array indentation can -    " fail... and defaultORcase can be at col 0. -    " if optimized mode is active and nor current or previous line are an 'else' -    " or the end of a possible bracketless thing then indent the same as the previous -    " line -    if last_line =~ '[;}]'.endline && last_line !~ '^)' && last_line !~# s:defaultORcase " Added && last_line !~ '^)' on 2007-12-30 -	if ind==b:PHP_default_indenting -	    " if no indentation for the previous line -	    return b:PHP_default_indenting -	elseif b:PHP_indentinghuge && ind==b:PHP_CurrentIndentLevel && cline !~# '^\s*\%(else\|\%(case\|default\).*:\|[})];\=\)' && last_line !~# '^\s*\%(\%(}\s*\)\=else\)' && getline(GetLastRealCodeLNum(lnum - 1))=~';'.endline -	    return b:PHP_CurrentIndentLevel -	endif -    endif - -    " used to prevent redundant tests in the last part of the script -    let LastLineClosed = 0 - -    let terminated = '\%(;\%(\s*?>\)\=\|<<<''\=\a\w*''\=$\|^\s*}\)'.endline -    " What is a terminated line? -    " - a line terminated by a ";" optionally followed by a "?>" -    " - a HEREDOC starter line (the content of such block is never seen by this script) -    " - a "}" not followed by a "{" - -    let unstated   = '\%(^\s*'.s:blockstart.'.*)\|\%(//.*\)\@<!\<e'.'lse\>\)'.endline -    " What is an unstated line? -    " - an "else" at the end of line -    " - a  s:blockstart (if while etc...) followed by anything but a ";" at -    "	the end of line - -    " if the current line is an 'else' starting line -    " (to match an 'else' preceded by a '}' is irrelevant and futile - see -    " code above) -    if ind != b:PHP_default_indenting && cline =~# '^\s*else\%(if\)\=\>' -	" prevent optimized to work at next call  XXX why ? -	let b:PHP_CurrentIndentLevel = b:PHP_default_indenting -	return indent(FindTheIfOfAnElse(v:lnum, 1)) -    elseif cline =~# s:defaultORcase -	" case and default need a special treatment -	return FindTheSwitchIndent(v:lnum) + &sw * b:PHP_vintage_case_default_indent -    elseif cline =~ '^\s*)\=\s*{' -	let previous_line = last_line -	let last_line_num = lnum - -	" let's find the indent of the block starter (if, while, for, etc...) -	while last_line_num > 1 - -	    if previous_line =~ '^\s*\%(' . s:blockstart . '\|\%([a-zA-Z]\s*\)*function\)' - -		let ind = indent(last_line_num) - -		" If the PHP_BracesAtCodeLevel is set then indent the '{' -		if  b:PHP_BracesAtCodeLevel -		    let ind = ind + &sw -		endif - -		return ind -	    endif - -	    let last_line_num = last_line_num - 1 -	    let previous_line = getline(last_line_num) -	endwhile - -    elseif last_line =~# unstated && cline !~ '^\s*);\='.endline -	let ind = ind + &sw " we indent one level further when the preceding line is not stated -	"echo "42" -	"call getchar() -	return ind - -	" If the last line is terminated by ';' or if it's a closing '}' -	" We need to check if this isn't the end of a multilevel non '{}' -	" structure such as: -	" Exemple: -	"			if ($truc) -	"				echo 'truc'; -	" -	"	OR -	" -	"			if ($truc) -	"				while ($truc) { -	"					lkhlkh(); -	"					echo 'infinite loop\n'; -	"				} -	" -	"	OR even (ADDED for version 1.17 - no modification required ) -	" -	"			$thing = -	"				"something"; -    elseif (ind != b:PHP_default_indenting || last_line =~ '^)' ) && last_line =~ terminated " Added || last_line =~ '^)' on 2007-12-30 (array indenting problem broke other things) -	" If we are here it means that the previous line is: -	" - a *;$ line -	" - a [beginning-blanck] } followed by anything but a { $ -	let previous_line = last_line -	let last_line_num = lnum -	let LastLineClosed = 1 -	" The idea here is to check if the current line is after a non '{}' -	" structure so we can indent it like the top of that structure. -	" The top of that structure is characterized by a if (ff)$ style line -	" preceded by a stated line. If there is no such structure then we -	" just have to find two 'normal' lines following each other with the -	" same indentation and with the first of these two lines terminated by -	" a ; or by a }... - -	while 1 -	    " let's skip '{}' blocks -	    if previous_line =~ '^\s*}' -		" find the opening '{' -		let last_line_num = FindOpenBracket(last_line_num) - -		" if the '{' is alone on the line get the line before -		if getline(last_line_num) =~ '^\s*{' -		    let last_line_num = GetLastRealCodeLNum(last_line_num - 1) -		endif - -		let previous_line = getline(last_line_num) - -		continue -	    else -		" At this point we know that the previous_line isn't a closing -		" '}' so we can check if we really are in such a structure. - -		" it's not a '}' but it could be an else alone... -		if getline(last_line_num) =~# '^\s*else\%(if\)\=\>' -		    let last_line_num = FindTheIfOfAnElse(last_line_num, 0) -		    " re-run the loop (we could find a '}' again) -		    continue -		endif - -		" So now it's ok we can check :-) -		" A good quality is to have confidence in oneself so to know -		" if yes or no we are in that struct lets test the indent of -		" last_line_num and of last_line_num - 1! -		" If those are == then we are almost done. -		" -		" That isn't sufficient, we need to test how the first of -		" these 2 lines ends... - -		" Remember the 'topest' line we found so far -		let last_match = last_line_num - -		let one_ahead_indent = indent(last_line_num) -		let last_line_num = GetLastRealCodeLNum(last_line_num - 1) -		let two_ahead_indent = indent(last_line_num) -		let after_previous_line = previous_line -		let previous_line = getline(last_line_num) - - -		" If we find a '{' or a case/default then we are inside that block so lets -		" indent properly... Like the line following that block starter -		if previous_line =~# s:defaultORcase.'\|{'.endline -		    break -		endif - -		" The 3 lines below are not necessary for the script to work -		" but it makes it work a little more faster in some (rare) cases. -		" We verify if we are at the top of a non '{}' struct. -		if after_previous_line=~# '^\s*'.s:blockstart.'.*)'.endline && previous_line =~# '[;}]'.endline -		    break -		endif - -		if one_ahead_indent == two_ahead_indent || last_line_num < 1 -		    " So the previous line and the line before are at the same -		    " col. Now we just have to check if the line before is a ;$ or [}]$ ended line -		    " we always check the most ahead line of the 2 lines so -		    " it's useless to match ')$' since the lines couldn't have -		    " the same indent... -		    if previous_line =~# '\%(;\|^\s*}\)'.endline || last_line_num < 1 -			break -		    endif -		endif -	    endif -	endwhile - -	if indent(last_match) != ind -	    " let's use the indent of the last line matched by the algorithm above -	    let ind = indent(last_match) -	    " line added in version 1.02 to prevent optimized mode -	    " from acting in some special cases -	    let b:PHP_CurrentIndentLevel = b:PHP_default_indenting - -	    return ind -	endif -	" if nothing was done lets the old script continue -    endif - -    let plinnum = GetLastRealCodeLNum(lnum - 1) -    " previous to last line -    let AntepenultimateLine = getline(plinnum) - -    " REMOVE comments at end of line before treatment -    " the first part of the regex removes // from the end of line when they are -    " followed by a number of '"' which is a multiple of 2. The second part -    " removes // that are not followed by any '"' -    " Sorry for this unreadable thing... -    let last_line = substitute(last_line,"\\(//\\|#\\)\\(\\(\\([^\"']*\\([\"']\\)[^\"']*\\5\\)\\+[^\"']*$\\)\\|\\([^\"']*$\\)\\)",'','') - - -    if ind == b:PHP_default_indenting -	if last_line =~ terminated -	    let LastLineClosed = 1 -	endif -    endif - -    " Indent blocks enclosed by {} or () (default indenting) -    if !LastLineClosed -	"echo "start" -	"call getchar() - -	" the last line isn't a .*; or a }$ line -	" Indent correctly multilevel and multiline '(.*)' things - -	" if the last line is a [{(]$ or a multiline function call (or array -	" declaration) with already one parameter on the opening ( line -	if last_line =~# '[{(]'.endline || last_line =~? '\h\w*\s*(.*,$' && AntepenultimateLine !~ '[,(]'.endline - -	    if !b:PHP_BracesAtCodeLevel || last_line !~# '^\s*{' -		let ind = ind + &sw -	    endif - -	    "	 echo "43" -	    "	 call getchar() -	    if b:PHP_BracesAtCodeLevel || b:PHP_vintage_case_default_indent == 1 -		" case and default are not indented inside blocks -		let b:PHP_CurrentIndentLevel = ind - -		return ind -	    endif - -	    " If the last line isn't empty and ends with a '),' then check if the -	    " ')' was opened on the same line, if not it means it closes a -	    " multiline '(.*)' thing and that the current line need to be -	    " de-indented one time. -	elseif last_line =~ '\S\+\s*),'.endline -	    call cursor(lnum, 1) -	    call search('),'.endline, 'W') -	    let openedparent = searchpair('(', '', ')', 'bW', 'Skippmatch()') -	    if openedparent != lnum -		let ind = indent(openedparent) -	    endif -	 -	    " if the line before starts a block then we need to indent the -	    " current line. -	elseif last_line =~ '^\s*'.s:blockstart -	    let ind = ind + &sw - -	    "echo cline. "  --test 5--	 " . ind -	    "call getchar() - -	    " In all other cases if the last line isn't terminated indent 1 -	    " level higher but only if the last line wasn't already indented -	    " for the same "code event"/reason. IE: if the antepenultimate line is terminated. -	    " -	    " 2nd explanation: -	    "	    - Test if the antepenultimate line is terminated or is -	    "	    a default/case if yes indent else let since it must have -	    "	    been indented correctly already - -	"elseif cline !~ '^\s*{' && AntepenultimateLine =~ '\%(;\%(\s*?>\)\=\|<<<\a\w*\|{\|^\s*'.s:blockstart.'.*)\)'.endline.'\|^\s*}\|'.s:defaultORcase -	elseif AntepenultimateLine =~ '\%(;\%(\s*?>\)\=\|<<<''\=\a\w*''\=$\|^\s*}\|{\)'.endline . '\|' . s:defaultORcase -	    let ind = ind + &sw -	    "echo pline. "  --test 2--	 " . ind -	    "call getchar() -	endif - -    endif -  -    "echo "end" -    "call getchar() -    " If the current line closes a multiline function call or array def -    if cline =~  '^\s*);\=' -	let ind = ind - &sw -    endif - -    let b:PHP_CurrentIndentLevel = ind -    return ind -endfunction - -" vim: set ts=8 sw=4 sts=4: | 
