vim: update release.sh to vim 7.3
[msysgit/mtrensch.git] / share / vim / vim72 / indent / php.vim
blob6124eb2f6637d7886be4804b9640288b8c2c03e6
1 " Vim indent file
2 " Language:     PHP
3 " Author:       John Wellesz <John.wellesz (AT) teaser (DOT) fr>
4 " URL:          http://www.2072productions.com/vim/indent/php.vim
5 " Last Change:  2008 June 7th
6 " Newsletter:   http://www.2072productions.com/?to=php-indent-for-vim-newsletter.php
7 " Version:      1.28
9 "  If you find a bug, please e-mail me at John.wellesz (AT) teaser (DOT) fr
10 "  with an example of code that breaks the algorithm.
12 "  ---> The change log and all the comments have been removed from this file.
14 "  For a complete change log and fully commented code, download the script on
15 "  2072productions.com at the URI provided above.
17 "  If you find a bug, please e-mail me at John.wellesz (AT) teaser (DOT) fr
18 "  with an example of code that breaks the algorithm.
21 "       Thanks a lot for using this script.
24 " NOTE: This script must be used with PHP syntax ON and with the php syntax
25 "       script by Lutz Eymers (http://www.isp.de/data/php.vim ) or with the
26 "       script by Peter Hodge (http://www.vim.org/scripts/script.php?script_id=1571 )
27 "       the later is bunbdled by default with vim 7.
30 "       In the case you have syntax errors in your script such as HereDoc end
31 "       identifiers not at col 1 you'll have to indent your file 2 times (This
32 "       script will automatically put HereDoc end identifiers at col 1 if
33 "       they are followed by a ';').
36 " NOTE: If you are editing file in Unix file format and that (by accident)
37 " there are '\r' before new lines, this script won't be able to proceed
38 " correctly and will make many mistakes because it won't be able to match
39 " '\s*$' correctly.
40 " So you have to remove those useless characters first with a command like:
42 " :%s /\r$//g
44 " or simply 'let' the option PHP_removeCRwhenUnix to 1 and the script will
45 " silently remove them when VIM load this script (at each bufread).
48 " Options: PHP_autoformatcomment = 0 to not enable autoformating of comment by
49 "                   default, if set to 0, this script will let the 'formatoptions' setting intact.
51 " Options: PHP_default_indenting = # of sw (default is 0), # of sw will be
52 "                  added to the indent of each line of PHP code.
54 " Options: PHP_removeCRwhenUnix = 1 to make the script automatically remove CR
55 "                  at end of lines (by default this option is unset), NOTE that you
56 "                  MUST remove CR when the fileformat is UNIX else the indentation
57 "                  won't be correct!
59 " Options: PHP_BracesAtCodeLevel = 1 to indent the '{' and '}' at the same
60 "                  level than the code they contain.
61 "                  Exemple:
62 "                       Instead of:
63 "                               if ($foo)
64 "                               {
65 "                                       foo();
66 "                               }
68 "                       You will write:
69 "                               if ($foo)
70 "                                       {
71 "                                       foo();
72 "                                       }
74 "                       NOTE: The script will be a bit slower if you use this option because
75 "                       some optimizations won't be available.
77 " Options: PHP_vintage_case_default_indent = 1 (defaults to 0) to add a meaningless indent
78 "                   befaore 'case:' and 'default":' statement in switch block
81 if exists("b:did_indent")
82     finish
83 endif
84 let b:did_indent = 1
87 let php_sync_method = 0
90 if exists("PHP_default_indenting")
91     let b:PHP_default_indenting = PHP_default_indenting * &sw
92 else
93     let b:PHP_default_indenting = 0
94 endif
96 if exists("PHP_BracesAtCodeLevel")
97     let b:PHP_BracesAtCodeLevel = PHP_BracesAtCodeLevel
98 else
99     let b:PHP_BracesAtCodeLevel = 0
100 endif
103 if exists("PHP_autoformatcomment")
104     let b:PHP_autoformatcomment = PHP_autoformatcomment
105 else
106     let b:PHP_autoformatcomment = 1
107 endif
109 if exists("PHP_vintage_case_default_indent")
110     let b:PHP_vintage_case_default_indent = PHP_vintage_case_default_indent
111 else
112     let b:PHP_vintage_case_default_indent = 0
113 endif
117 let b:PHP_lastindented = 0
118 let b:PHP_indentbeforelast = 0
119 let b:PHP_indentinghuge = 0
120 let b:PHP_CurrentIndentLevel = b:PHP_default_indenting
121 let b:PHP_LastIndentedWasComment = 0
122 let b:PHP_InsideMultilineComment = 0
123 let b:InPHPcode = 0
124 let b:InPHPcode_checked = 0
125 let b:InPHPcode_and_script = 0
126 let b:InPHPcode_tofind = ""
127 let b:PHP_oldchangetick = b:changedtick
128 let b:UserIsTypingComment = 0
129 let b:optionsset = 0
131 setlocal nosmartindent
132 setlocal noautoindent
133 setlocal nocindent
134 setlocal nolisp
136 setlocal indentexpr=GetPhpIndent()
137 setlocal indentkeys=0{,0},0),:,!^F,o,O,e,*<Return>,=?>,=<?,=*/
141 let s:searchpairflags = 'bWr'
143 if &fileformat == "unix" && exists("PHP_removeCRwhenUnix") && PHP_removeCRwhenUnix
144     silent! %s/\r$//g
145 endif
147 if exists("*GetPhpIndent")
148     finish " XXX
149 endif
151 let s:endline= '\s*\%(//.*\|#.*\|/\*.*\*/\s*\)\=$'
152 let s:PHP_startindenttag = '<?\%(.*?>\)\@!\|<script[^>]*>\%(.*<\/script>\)\@!'
153 "setlocal debug=msg " XXX
156 function! GetLastRealCodeLNum(startline) " {{{
158     let lnum = a:startline
160     if b:GetLastRealCodeLNum_ADD && b:GetLastRealCodeLNum_ADD == lnum + 1
161         let lnum = b:GetLastRealCodeLNum_ADD
162     endif
164     let old_lnum = lnum
166     while lnum > 1
167         let lnum = prevnonblank(lnum)
168         let lastline = getline(lnum)
170         if b:InPHPcode_and_script && lastline =~ '?>\s*$'
171             let lnum = lnum - 1
172         elseif lastline =~ '^\s*?>.*<?\%(php\)\=\s*$'
173             let lnum = lnum - 1
174         elseif lastline =~ '^\s*\%(//\|#\|/\*.*\*/\s*$\)'
175             let lnum = lnum - 1
176         elseif lastline =~ '\*/\s*$'
177             call cursor(lnum, 1)
178             if lastline !~ '^\*/'
179                 call search('\*/', 'W')
180             endif
181             let lnum = searchpair('/\*', '', '\*/', s:searchpairflags, 'Skippmatch2()')
183             let lastline = getline(lnum)
184             if lastline =~ '^\s*/\*'
185                 let lnum = lnum - 1
186             else
187                 break
188             endif
191         elseif lastline =~? '\%(//\s*\|?>.*\)\@<!<?\%(php\)\=\s*$\|^\s*<script\>'
193             while lastline !~ '\(<?.*\)\@<!?>' && lnum > 1
194                 let lnum = lnum - 1
195                 let lastline = getline(lnum)
196             endwhile
197             if lastline =~ '^\s*?>'
198                 let lnum = lnum - 1
199             else
200                 break
201             endif
204         elseif lastline =~? '^\a\w*;\=$' && lastline !~? s:notPhpHereDoc " XXX 0607
205             let tofind=substitute( lastline, '\(\a\w*\);\=', '<<<''\\=\1''\\=$', '') " XXX 0607
206             while getline(lnum) !~? tofind && lnum > 1
207                 let lnum = lnum - 1
208             endwhile
209         else
210             break
211         endif
212     endwhile
214     if lnum==1 && getline(lnum)!~ '<?'
215         let lnum=0
216     endif
218     if b:InPHPcode_and_script && !b:InPHPcode
219         let b:InPHPcode_and_script = 0
220     endif
224     return lnum
225 endfunction " }}}
227 function! Skippmatch2()
229     let line = getline(".")
231    if line =~ '\%(".*\)\@<=/\*\%(.*"\)\@=' || line =~ '\%(\%(//\|#\).*\)\@<=/\*'
232        return 1
233    else
234        return 0
235    endif
236 endfun
238 function! Skippmatch()  " {{{
239     let synname = synIDattr(synID(line("."), col("."), 0), "name")
240     if synname == "Delimiter" || synname == "phpRegionDelimiter" || synname =~# "^phpParent" || synname == "phpArrayParens" || synname =~# '^php\%(Block\|Brace\)' || synname == "javaScriptBraces" || synname =~# "^phpComment" && b:UserIsTypingComment
241         return 0
242     else
243         return 1
244     endif
245 endfun " }}}
247 function! FindOpenBracket(lnum) " {{{
248     call cursor(a:lnum, 1)
249     return searchpair('{', '', '}', 'bW', 'Skippmatch()')
250 endfun " }}}
252 function! FindTheIfOfAnElse (lnum, StopAfterFirstPrevElse) " {{{
254     if getline(a:lnum) =~# '^\s*}\s*else\%(if\)\=\>'
255         let beforeelse = a:lnum
256     else
257         let beforeelse = GetLastRealCodeLNum(a:lnum - 1)
258     endif
260     if !s:level
261         let s:iftoskip = 0
262     endif
264     if getline(beforeelse) =~# '^\s*\%(}\s*\)\=else\%(\s*if\)\@!\>'
265         let s:iftoskip = s:iftoskip + 1
266     endif
268     if getline(beforeelse) =~ '^\s*}'
269         let beforeelse = FindOpenBracket(beforeelse)
271         if getline(beforeelse) =~ '^\s*{'
272             let beforeelse = GetLastRealCodeLNum(beforeelse - 1)
273         endif
274     endif
277     if !s:iftoskip && a:StopAfterFirstPrevElse && getline(beforeelse) =~# '^\s*\%([}]\s*\)\=else\%(if\)\=\>'
278         return beforeelse
279     endif
281     if getline(beforeelse) !~# '^\s*if\>' && beforeelse>1 || s:iftoskip && beforeelse>1
283         if  s:iftoskip && getline(beforeelse) =~# '^\s*if\>'
284             let s:iftoskip = s:iftoskip - 1
285         endif
287         let s:level =  s:level + 1
288         let beforeelse = FindTheIfOfAnElse(beforeelse, a:StopAfterFirstPrevElse)
289     endif
291     return beforeelse
293 endfunction " }}}
295 function! IslinePHP (lnum, tofind) " {{{
296     let cline = getline(a:lnum)
298     if a:tofind==""
299         let tofind = "^\\s*[\"']*\\s*\\zs\\S"
300     else
301         let tofind = a:tofind
302     endif
304     let tofind = tofind . '\c'
306     let coltotest = match (cline, tofind) + 1
308     let synname = synIDattr(synID(a:lnum, coltotest, 0), "name")
310     if synname =~ '^php' || synname=="Delimiter" || synname =~? '^javaScript'
311         return synname
312     else
313         return ""
314     endif
315 endfunction " }}}
317 let s:notPhpHereDoc = '\%(break\|return\|continue\|exit\|else\)'
318 let s:blockstart = '\%(\%(\%(}\s*\)\=else\%(\s\+\)\=\)\=if\>\|else\>\|while\>\|switch\>\|for\%(each\)\=\>\|declare\>\|class\>\|interface\>\|abstract\>\|try\>\|catch\>\)'
320 let s:autorestoptions = 0
321 if ! s:autorestoptions
322     au BufWinEnter,Syntax       *.php,*.php3,*.php4,*.php5      call ResetOptions()
323     let s:autorestoptions = 1
324 endif
326 function! ResetOptions()
327     if ! b:optionsset
328         if b:PHP_autoformatcomment
330             setlocal comments=s1:/*,mb:*,ex:*/,://,:#
332             setlocal formatoptions-=t
333             setlocal formatoptions+=q
334             setlocal formatoptions+=r
335             setlocal formatoptions+=o
336             setlocal formatoptions+=w
337             setlocal formatoptions+=c
338             setlocal formatoptions+=b
339         endif
340         let b:optionsset = 1
341     endif
342 endfunc
344 function! GetPhpIndent()
346     let b:GetLastRealCodeLNum_ADD = 0
348     let UserIsEditing=0
349     if  b:PHP_oldchangetick != b:changedtick
350         let b:PHP_oldchangetick = b:changedtick
351         let UserIsEditing=1
352     endif
354     if b:PHP_default_indenting
355         let b:PHP_default_indenting = g:PHP_default_indenting * &sw
356     endif
358     let cline = getline(v:lnum)
360     if !b:PHP_indentinghuge && b:PHP_lastindented > b:PHP_indentbeforelast
361         if b:PHP_indentbeforelast
362             let b:PHP_indentinghuge = 1
363             echom 'Large indenting detected, speed optimizations engaged (v1.28)'
364         endif
365         let b:PHP_indentbeforelast = b:PHP_lastindented
366     endif
368     if b:InPHPcode_checked && prevnonblank(v:lnum - 1) != b:PHP_lastindented
369         if b:PHP_indentinghuge
370             echom 'Large indenting deactivated'
371             let b:PHP_indentinghuge = 0
372             let b:PHP_CurrentIndentLevel = b:PHP_default_indenting
373         endif
374         let b:PHP_lastindented = v:lnum
375         let b:PHP_LastIndentedWasComment=0
376         let b:PHP_InsideMultilineComment=0
377         let b:PHP_indentbeforelast = 0
379         let b:InPHPcode = 0
380         let b:InPHPcode_checked = 0
381         let b:InPHPcode_and_script = 0
382         let b:InPHPcode_tofind = ""
384     elseif v:lnum > b:PHP_lastindented
385         let real_PHP_lastindented = b:PHP_lastindented
386         let b:PHP_lastindented = v:lnum
387     endif
390     if !b:InPHPcode_checked " {{{ One time check
391         let b:InPHPcode_checked = 1
393         let synname = ""
394         if cline !~ '<?.*?>'
395             let synname = IslinePHP (prevnonblank(v:lnum), "")
396         endif
398         if synname!=""
399             if synname != "phpHereDoc" && synname != "phpHereDocDelimiter"
400                 let b:InPHPcode = 1
401                 let b:InPHPcode_tofind = ""
403                 if synname =~# "^phpComment"
404                     let b:UserIsTypingComment = 1
405                 else
406                     let b:UserIsTypingComment = 0
407                 endif
409                 if synname =~? '^javaScript'
410                     let b:InPHPcode_and_script = 1
411                 endif
413             else
414                 let b:InPHPcode = 0
415                 let b:UserIsTypingComment = 0
417                 let lnum = v:lnum - 1
418                 while getline(lnum) !~? '<<<''\=\a\w*''\=$' && lnum > 1
419                     let lnum = lnum - 1
420                 endwhile
422                 let b:InPHPcode_tofind = substitute( getline(lnum), '^.*<<<''\=\(\a\w*\)''\=$', '^\\s*\1;\\=$', '') " XXX 0607
423             endif
424         else
425             let b:InPHPcode = 0
426             let b:UserIsTypingComment = 0
427             let b:InPHPcode_tofind = '<?\%(.*?>\)\@!\|<script.*>'
428         endif
429     endif "!b:InPHPcode_checked }}}
432     " Test if we are indenting PHP code {{{
433     let lnum = prevnonblank(v:lnum - 1)
434     let last_line = getline(lnum)
436     if b:InPHPcode_tofind!=""
437         if cline =~? b:InPHPcode_tofind
438             let b:InPHPcode = 1
439             let b:InPHPcode_tofind = ""
440             let b:UserIsTypingComment = 0
441             if cline =~ '\*/'
442                 call cursor(v:lnum, 1)
443                 if cline !~ '^\*/'
444                     call search('\*/', 'W')
445                 endif
446                 let lnum = searchpair('/\*', '', '\*/', s:searchpairflags, 'Skippmatch2()')
448                 let b:PHP_CurrentIndentLevel = b:PHP_default_indenting
450                 let b:PHP_LastIndentedWasComment = 0
452                 if cline =~ '^\s*\*/'
453                     return indent(lnum) + 1
454                 else
455                     return indent(lnum)
456                 endif
458             elseif cline =~? '<script\>'
459                 let b:InPHPcode_and_script = 1
460                 let b:GetLastRealCodeLNum_ADD = v:lnum
461             endif
462         endif
463     endif
465     if b:InPHPcode
467         if !b:InPHPcode_and_script && last_line =~ '\%(<?.*\)\@<!?>\%(.*<?\)\@!' && IslinePHP(lnum, '?>')=~"Delimiter"
468             if cline !~? s:PHP_startindenttag
469                 let b:InPHPcode = 0
470                 let b:InPHPcode_tofind = s:PHP_startindenttag
471             elseif cline =~? '<script\>'
472                 let b:InPHPcode_and_script = 1
473             endif
475         elseif last_line =~? '<<<''\=\a\w*''\=$' " XXX 0607
476             let b:InPHPcode = 0
477             let b:InPHPcode_tofind = substitute( last_line, '^.*<<<''\=\(\a\w*\)''\=$', '^\\s*\1;\\=$', '') " XXX 0607
479         elseif !UserIsEditing && cline =~ '^\s*/\*\%(.*\*/\)\@!' && getline(v:lnum + 1) !~ '^\s*\*'
480             let b:InPHPcode = 0
481             let b:InPHPcode_tofind = '\*/'
483         elseif cline =~? '^\s*</script>'
484             let b:InPHPcode = 0
485             let b:InPHPcode_tofind = s:PHP_startindenttag
486         endif
487     endif " }}}
490     if !b:InPHPcode && !b:InPHPcode_and_script
491         return -1
492     endif
494     " Indent successive // or # comment the same way the first is {{{
495     if cline =~ '^\s*\%(//\|#\|/\*.*\*/\s*$\)'
496         if b:PHP_LastIndentedWasComment == 1
497             return indent(real_PHP_lastindented)
498         endif
499         let b:PHP_LastIndentedWasComment = 1
500     else
501         let b:PHP_LastIndentedWasComment = 0
502     endif " }}}
504     " Indent multiline /* comments correctly {{{
506     if b:PHP_InsideMultilineComment || b:UserIsTypingComment
507         if cline =~ '^\s*\*\%(\/\)\@!'
508             if last_line =~ '^\s*/\*'
509                 return indent(lnum) + 1
510             else
511                 return indent(lnum)
512             endif
513         else
514             let b:PHP_InsideMultilineComment = 0
515         endif
516     endif
518     if !b:PHP_InsideMultilineComment && cline =~ '^\s*/\*' && cline !~ '\*/\s*$'
519         if getline(v:lnum + 1) !~ '^\s*\*'
520             return -1
521         endif
522         let b:PHP_InsideMultilineComment = 1
523     endif " }}}
526     " Things always indented at col 1 (PHP delimiter: <?, ?>, Heredoc end) {{{
527     if cline =~# '^\s*<?' && cline !~ '?>'
528         return 0
529     endif
531     if  cline =~ '^\s*?>' && cline !~# '<?'
532         return 0
533     endif
535     if cline =~? '^\s*\a\w*;$\|^\a\w*$' && cline !~? s:notPhpHereDoc " XXX 0607
536         return 0
537     endif " }}}
539     let s:level = 0
541     let lnum = GetLastRealCodeLNum(v:lnum - 1)
543     let last_line = getline(lnum)
544     let ind = indent(lnum)
545     let endline= s:endline
547     if ind==0 && b:PHP_default_indenting
548         let ind = b:PHP_default_indenting
549     endif
551     if lnum == 0
552         return b:PHP_default_indenting
553     endif
556     if cline =~ '^\s*}\%(}}\)\@!'
557         let ind = indent(FindOpenBracket(v:lnum))
558         let b:PHP_CurrentIndentLevel = b:PHP_default_indenting
559         return ind
560     endif
562     if cline =~ '^\s*\*/'
563         call cursor(v:lnum, 1)
564         if cline !~ '^\*/'
565             call search('\*/', 'W')
566         endif
567         let lnum = searchpair('/\*', '', '\*/', s:searchpairflags, 'Skippmatch2()')
569         let b:PHP_CurrentIndentLevel = b:PHP_default_indenting
571         if cline =~ '^\s*\*/'
572             return indent(lnum) + 1
573         else
574             return indent(lnum)
575         endif
576     endif
578     let defaultORcase = '^\s*\%(default\|case\).*:'
580     if last_line =~ '[;}]'.endline && last_line !~ '^)' && last_line !~# defaultORcase " Added && last_line !~ '^)' on 2007-12-30
581         if ind==b:PHP_default_indenting
582             return b:PHP_default_indenting
583         elseif b:PHP_indentinghuge && ind==b:PHP_CurrentIndentLevel && cline !~# '^\s*\%(else\|\%(case\|default\).*:\|[})];\=\)' && last_line !~# '^\s*\%(\%(}\s*\)\=else\)' && getline(GetLastRealCodeLNum(lnum - 1))=~';'.endline
584             return b:PHP_CurrentIndentLevel
585         endif
586     endif
588     let LastLineClosed = 0
590     let terminated = '\%(;\%(\s*?>\)\=\|<<<''\=\a\w*''\=$\|^\s*}\)'.endline " XXX 0607
592     let unstated   = '\%(^\s*'.s:blockstart.'.*)\|\%(//.*\)\@<!\<e'.'lse\>\)'.endline
594     if ind != b:PHP_default_indenting && cline =~# '^\s*else\%(if\)\=\>'
595         let b:PHP_CurrentIndentLevel = b:PHP_default_indenting
596         return indent(FindTheIfOfAnElse(v:lnum, 1))
597     elseif cline =~ '^\s*)\=\s*{'
598         let previous_line = last_line
599         let last_line_num = lnum
601         while last_line_num > 1
603             if previous_line =~ '^\s*\%(' . s:blockstart . '\|\%([a-zA-Z]\s*\)*function\)'
605                 let ind = indent(last_line_num)
607                 if  b:PHP_BracesAtCodeLevel
608                     let ind = ind + &sw
609                 endif
611                 return ind
612             endif
614             let last_line_num = last_line_num - 1
615             let previous_line = getline(last_line_num)
616         endwhile
618     elseif last_line =~# unstated && cline !~ '^\s*);\='.endline
619         let ind = ind + &sw " we indent one level further when the preceding line is not stated
620         return ind
622     elseif (ind != b:PHP_default_indenting || last_line =~ '^)' ) && last_line =~ terminated " Added || last_line =~ '^)' on 2007-12-30 (array indenting [rpblem broke other things)
623         let previous_line = last_line
624         let last_line_num = lnum
625         let LastLineClosed = 1
627         while 1
628             if previous_line =~ '^\s*}'
629                 let last_line_num = FindOpenBracket(last_line_num)
631                 if getline(last_line_num) =~ '^\s*{'
632                     let last_line_num = GetLastRealCodeLNum(last_line_num - 1)
633                 endif
635                 let previous_line = getline(last_line_num)
637                 continue
638             else
640                 if getline(last_line_num) =~# '^\s*else\%(if\)\=\>'
641                     let last_line_num = FindTheIfOfAnElse(last_line_num, 0)
642                     continue
643                 endif
646                 let last_match = last_line_num
648                 let one_ahead_indent = indent(last_line_num)
649                 let last_line_num = GetLastRealCodeLNum(last_line_num - 1)
650                 let two_ahead_indent = indent(last_line_num)
651                 let after_previous_line = previous_line
652                 let previous_line = getline(last_line_num)
655                 if previous_line =~# defaultORcase.'\|{'.endline
656                     break
657                 endif
659                 if after_previous_line=~# '^\s*'.s:blockstart.'.*)'.endline && previous_line =~# '[;}]'.endline
660                     break
661                 endif
663                 if one_ahead_indent == two_ahead_indent || last_line_num < 1
664                     if previous_line =~# '\%(;\|^\s*}\)'.endline || last_line_num < 1
665                         break
666                     endif
667                 endif
668             endif
669         endwhile
671         if indent(last_match) != ind
672             let ind = indent(last_match)
673             let b:PHP_CurrentIndentLevel = b:PHP_default_indenting
675             if cline =~# defaultORcase
676                 let ind = ind - &sw
677             endif
678             return ind
679         endif
680     endif
682     let plinnum = GetLastRealCodeLNum(lnum - 1)
683     let pline = getline(plinnum)
685     let last_line = substitute(last_line,"\\(//\\|#\\)\\(\\(\\([^\"']*\\([\"']\\)[^\"']*\\5\\)\\+[^\"']*$\\)\\|\\([^\"']*$\\)\\)",'','')
688     if ind == b:PHP_default_indenting
689         if last_line =~ terminated
690             let LastLineClosed = 1
691         endif
692     endif
694     if !LastLineClosed
696         if last_line =~# '[{(]'.endline || last_line =~? '\h\w*\s*(.*,$' && pline !~ '[,(]'.endline
698             if !b:PHP_BracesAtCodeLevel || last_line !~# '^\s*{'
699                 let ind = ind + &sw
700             endif
702             if b:PHP_BracesAtCodeLevel || b:PHP_vintage_case_default_indent == 1 || cline !~# defaultORcase
703                 let b:PHP_CurrentIndentLevel = ind
705                 return ind
706             endif
708         elseif last_line =~ '\S\+\s*),'.endline
709             call cursor(lnum, 1)
710             call search('),'.endline, 'W')
711             let openedparent = searchpair('(', '', ')', 'bW', 'Skippmatch()')
712             if openedparent != lnum
713                 let ind = indent(openedparent)
714             endif
715         elseif last_line =~ '^\s*'.s:blockstart
716             let ind = ind + &sw
718         elseif last_line =~# defaultORcase
719             let ind = ind + &sw
722         elseif pline =~ '\%(;\%(\s*?>\)\=\|<<<''\=\a\w*''\=$\|^\s*}\|{\)'.endline . '\|' . defaultORcase
724             let ind = ind + &sw
725         endif
727     endif
729     if cline =~  '^\s*);\='
730         let ind = ind - &sw
731     elseif cline =~# defaultORcase && last_line !~# defaultORcase
732         let ind = ind - &sw
734     endif
736     let b:PHP_CurrentIndentLevel = ind
737     return ind
738 endfunction