xref: /vim-8.2.3635/runtime/indent/php.vim (revision 00a927d6)
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 November 22nd
6" Newsletter:   http://www.2072productions.com/?to=php-indent-for-vim-newsletter.php
7" Version:	1.30
8"
9"
10"  If you find a bug, please e-mail me at John.wellesz (AT) teaser (DOT) fr
11"  with an example of code that breaks the algorithm.
12"
13"
14"	Thanks a lot for using this script.
15"
16"
17" NOTE: This script must be used with PHP syntax ON and with the php syntax
18"	script by Lutz Eymers (http://www.isp.de/data/php.vim ) or with the
19"	script by Peter Hodge (http://www.vim.org/scripts/script.php?script_id=1571 )
20"	the later is bunbdled by default with Vim 7.
21"
22"
23"	In the case you have syntax errors in your script such as HereDoc end
24"	identifiers not at col 1 you'll have to indent your file 2 times (This
25"	script will automatically put HereDoc end identifiers at col 1 if
26"	they are followed by a ';').
27"
28"
29" NOTE: If you are editing files in Unix file format and that (by accident)
30"	there are '\r' before new lines, this script won't be able to proceed
31"	correctly and will make many mistakes because it won't be able to match
32"	'\s*$' correctly.
33"	So you have to remove those useless characters first with a command like:
34"
35"	:%s /\r$//g
36"
37"	or simply 'let' the option PHP_removeCRwhenUnix to 1 and the script will
38"	silently remove them when VIM load this script (at each bufread).
39"
40" Options: See :help php-indent for available options.
41
42
43if exists("b:did_indent")
44    finish
45endif
46let b:did_indent = 1
47
48
49let php_sync_method = 0
50
51
52if exists("PHP_default_indenting")
53    let b:PHP_default_indenting = PHP_default_indenting * &sw
54else
55    let b:PHP_default_indenting = 0
56endif
57
58if exists("PHP_BracesAtCodeLevel")
59    let b:PHP_BracesAtCodeLevel = PHP_BracesAtCodeLevel
60else
61    let b:PHP_BracesAtCodeLevel = 0
62endif
63
64
65if exists("PHP_autoformatcomment")
66    let b:PHP_autoformatcomment = PHP_autoformatcomment
67else
68    let b:PHP_autoformatcomment = 1
69endif
70
71if exists("PHP_vintage_case_default_indent")
72    let b:PHP_vintage_case_default_indent = PHP_vintage_case_default_indent
73else
74    let b:PHP_vintage_case_default_indent = 0
75endif
76
77
78
79let b:PHP_lastindented = 0
80let b:PHP_indentbeforelast = 0
81let b:PHP_indentinghuge = 0
82let b:PHP_CurrentIndentLevel = b:PHP_default_indenting
83let b:PHP_LastIndentedWasComment = 0
84let b:PHP_InsideMultilineComment = 0
85let b:InPHPcode = 0
86let b:InPHPcode_checked = 0
87let b:InPHPcode_and_script = 0
88let b:InPHPcode_tofind = ""
89let b:PHP_oldchangetick = b:changedtick
90let b:UserIsTypingComment = 0
91let b:optionsset = 0
92
93setlocal nosmartindent
94setlocal noautoindent
95setlocal nocindent
96setlocal nolisp
97
98setlocal indentexpr=GetPhpIndent()
99setlocal indentkeys=0{,0},0),:,!^F,o,O,e,*<Return>,=?>,=<?,=*/
100
101
102
103let s:searchpairflags = 'bWr'
104
105if &fileformat == "unix" && exists("PHP_removeCRwhenUnix") && PHP_removeCRwhenUnix
106    silent! %s/\r$//g
107endif
108
109if exists("*GetPhpIndent")
110    call ResetPhpOptions()
111    finish " XXX
112endif
113
114let s:endline= '\s*\%(//.*\|#.*\|/\*.*\*/\s*\)\=$'
115let s:PHP_startindenttag = '<?\%(.*?>\)\@!\|<script[^>]*>\%(.*<\/script>\)\@!'
116"setlocal debug=msg " XXX
117
118
119function! GetLastRealCodeLNum(startline) " {{{
120
121    let lnum = a:startline
122
123    if b:GetLastRealCodeLNum_ADD && b:GetLastRealCodeLNum_ADD == lnum + 1
124	let lnum = b:GetLastRealCodeLNum_ADD
125    endif
126
127    let old_lnum = lnum
128
129    while lnum > 1
130	let lnum = prevnonblank(lnum)
131	let lastline = getline(lnum)
132
133	if b:InPHPcode_and_script && lastline =~ '?>\s*$'
134	    let lnum = lnum - 1
135	elseif lastline =~ '^\s*?>.*<?\%(php\)\=\s*$'
136	    let lnum = lnum - 1
137	elseif lastline =~ '^\s*\%(//\|#\|/\*.*\*/\s*$\)'
138	    let lnum = lnum - 1
139	elseif lastline =~ '\*/\s*$'
140	    call cursor(lnum, 1)
141	    if lastline !~ '^\*/'
142		call search('\*/', 'W')
143	    endif
144	    let lnum = searchpair('/\*', '', '\*/', s:searchpairflags, 'Skippmatch2()')
145
146	    let lastline = getline(lnum)
147	    if lastline =~ '^\s*/\*'
148		let lnum = lnum - 1
149	    else
150		break
151	    endif
152
153
154	elseif lastline =~? '\%(//\s*\|?>.*\)\@<!<?\%(php\)\=\s*$\|^\s*<script\>'
155
156	    while lastline !~ '\(<?.*\)\@<!?>' && lnum > 1
157		let lnum = lnum - 1
158		let lastline = getline(lnum)
159	    endwhile
160	    if lastline =~ '^\s*?>'
161		let lnum = lnum - 1
162	    else
163		break
164	    endif
165
166
167	elseif lastline =~? '^\a\w*;\=$' && lastline !~? s:notPhpHereDoc " XXX 0607
168	    let tofind=substitute( lastline, '\(\a\w*\);\=', '<<<''\\=\1''\\=$', '') " XXX 0607
169	    while getline(lnum) !~? tofind && lnum > 1
170		let lnum = lnum - 1
171	    endwhile
172	else
173	    break
174	endif
175    endwhile
176
177    if lnum==1 && getline(lnum)!~ '<?'
178	let lnum=0
179    endif
180
181    if b:InPHPcode_and_script && !b:InPHPcode
182	let b:InPHPcode_and_script = 0
183    endif
184
185
186
187    return lnum
188endfunction " }}}
189
190function! Skippmatch2()
191
192    let line = getline(".")
193
194   if line =~ '\%(".*\)\@<=/\*\%(.*"\)\@=' || line =~ '\%(\%(//\|#\).*\)\@<=/\*'
195       return 1
196   else
197       return 0
198   endif
199endfun
200
201function! Skippmatch()  " {{{
202    let synname = synIDattr(synID(line("."), col("."), 0), "name")
203    if synname == "Delimiter" || synname == "phpRegionDelimiter" || synname =~# "^phpParent" || synname == "phpArrayParens" || synname =~# '^php\%(Block\|Brace\)' || synname == "javaScriptBraces" || synname =~# "^phpComment" && b:UserIsTypingComment
204	return 0
205    else
206	return 1
207    endif
208endfun " }}}
209
210function! FindOpenBracket(lnum) " {{{
211    call cursor(a:lnum, 1)
212    return searchpair('{', '', '}', 'bW', 'Skippmatch()')
213endfun " }}}
214
215function! FindTheIfOfAnElse (lnum, StopAfterFirstPrevElse) " {{{
216
217    if getline(a:lnum) =~# '^\s*}\s*else\%(if\)\=\>'
218	let beforeelse = a:lnum
219    else
220	let beforeelse = GetLastRealCodeLNum(a:lnum - 1)
221    endif
222
223    if !s:level
224	let s:iftoskip = 0
225    endif
226
227    if getline(beforeelse) =~# '^\s*\%(}\s*\)\=else\%(\s*if\)\@!\>'
228	let s:iftoskip = s:iftoskip + 1
229    endif
230
231    if getline(beforeelse) =~ '^\s*}'
232	let beforeelse = FindOpenBracket(beforeelse)
233
234	if getline(beforeelse) =~ '^\s*{'
235	    let beforeelse = GetLastRealCodeLNum(beforeelse - 1)
236	endif
237    endif
238
239
240    if !s:iftoskip && a:StopAfterFirstPrevElse && getline(beforeelse) =~# '^\s*\%([}]\s*\)\=else\%(if\)\=\>'
241	return beforeelse
242    endif
243
244    if getline(beforeelse) !~# '^\s*if\>' && beforeelse>1 || s:iftoskip && beforeelse>1
245
246	if  s:iftoskip && getline(beforeelse) =~# '^\s*if\>'
247	    let s:iftoskip = s:iftoskip - 1
248	endif
249
250	let s:level =  s:level + 1
251	let beforeelse = FindTheIfOfAnElse(beforeelse, a:StopAfterFirstPrevElse)
252    endif
253
254    return beforeelse
255
256endfunction " }}}
257
258function! IslinePHP (lnum, tofind) " {{{
259    let cline = getline(a:lnum)
260
261    if a:tofind==""
262	let tofind = "^\\s*[\"']*\\s*\\zs\\S"
263    else
264	let tofind = a:tofind
265    endif
266
267    let tofind = tofind . '\c'
268
269    let coltotest = match (cline, tofind) + 1
270
271    let synname = synIDattr(synID(a:lnum, coltotest, 0), "name")
272
273    if synname =~ '^php' || synname=="Delimiter" || synname =~? '^javaScript'
274	return synname
275    else
276	return ""
277    endif
278endfunction " }}}
279
280let s:notPhpHereDoc = '\%(break\|return\|continue\|exit\|else\)'
281let s:blockstart = '\%(\%(\%(}\s*\)\=else\%(\s\+\)\=\)\=if\>\|else\>\|while\>\|switch\>\|for\%(each\)\=\>\|declare\>\|class\>\|interface\>\|abstract\>\|try\>\|catch\>\)'
282
283let s:autoresetoptions = 0
284if ! s:autoresetoptions
285    let s:autoresetoptions = 1
286endif
287
288function! ResetPhpOptions()
289    if ! b:optionsset && &filetype == "php"
290	if b:PHP_autoformatcomment
291
292	    setlocal comments=s1:/*,mb:*,ex:*/,://,:#
293
294	    setlocal formatoptions-=t
295	    setlocal formatoptions+=q
296	    setlocal formatoptions+=r
297	    setlocal formatoptions+=o
298	    setlocal formatoptions+=w
299	    setlocal formatoptions+=c
300	    setlocal formatoptions+=b
301	endif
302	let b:optionsset = 1
303    endif
304endfunc
305
306call ResetPhpOptions()
307
308function! GetPhpIndent()
309
310    let b:GetLastRealCodeLNum_ADD = 0
311
312    let UserIsEditing=0
313    if	b:PHP_oldchangetick != b:changedtick
314	let b:PHP_oldchangetick = b:changedtick
315	let UserIsEditing=1
316    endif
317
318    if b:PHP_default_indenting
319	let b:PHP_default_indenting = g:PHP_default_indenting * &sw
320    endif
321
322    let cline = getline(v:lnum)
323
324    if !b:PHP_indentinghuge && b:PHP_lastindented > b:PHP_indentbeforelast
325	if b:PHP_indentbeforelast
326	    let b:PHP_indentinghuge = 1
327	    echom 'Large indenting detected, speed optimizations engaged (v1.30)'
328	endif
329	let b:PHP_indentbeforelast = b:PHP_lastindented
330    endif
331
332    if b:InPHPcode_checked && prevnonblank(v:lnum - 1) != b:PHP_lastindented
333	if b:PHP_indentinghuge
334	    echom 'Large indenting deactivated'
335	    let b:PHP_indentinghuge = 0
336	    let b:PHP_CurrentIndentLevel = b:PHP_default_indenting
337	endif
338	let b:PHP_lastindented = v:lnum
339	let b:PHP_LastIndentedWasComment=0
340	let b:PHP_InsideMultilineComment=0
341	let b:PHP_indentbeforelast = 0
342
343	let b:InPHPcode = 0
344	let b:InPHPcode_checked = 0
345	let b:InPHPcode_and_script = 0
346	let b:InPHPcode_tofind = ""
347
348    elseif v:lnum > b:PHP_lastindented
349	let real_PHP_lastindented = b:PHP_lastindented
350	let b:PHP_lastindented = v:lnum
351    endif
352
353
354    if !b:InPHPcode_checked " {{{ One time check
355	let b:InPHPcode_checked = 1
356
357	let synname = ""
358	if cline !~ '<?.*?>'
359	    let synname = IslinePHP (prevnonblank(v:lnum), "")
360	endif
361
362	if synname!=""
363	    if synname != "phpHereDoc" && synname != "phpHereDocDelimiter"
364		let b:InPHPcode = 1
365		let b:InPHPcode_tofind = ""
366
367		if synname =~# "^phpComment"
368		    let b:UserIsTypingComment = 1
369		else
370		    let b:UserIsTypingComment = 0
371		endif
372
373		if synname =~? '^javaScript'
374		    let b:InPHPcode_and_script = 1
375		endif
376
377	    else
378		let b:InPHPcode = 0
379		let b:UserIsTypingComment = 0
380
381		let lnum = v:lnum - 1
382		while getline(lnum) !~? '<<<''\=\a\w*''\=$' && lnum > 1
383		    let lnum = lnum - 1
384		endwhile
385
386		let b:InPHPcode_tofind = substitute( getline(lnum), '^.*<<<''\=\(\a\w*\)''\=$', '^\\s*\1;\\=$', '') " XXX 0607
387	    endif
388	else
389	    let b:InPHPcode = 0
390	    let b:UserIsTypingComment = 0
391	    let b:InPHPcode_tofind = '<?\%(.*?>\)\@!\|<script.*>'
392	endif
393    endif "!b:InPHPcode_checked }}}
394
395
396    " Test if we are indenting PHP code {{{
397    let lnum = prevnonblank(v:lnum - 1)
398    let last_line = getline(lnum)
399
400    if b:InPHPcode_tofind!=""
401	if cline =~? b:InPHPcode_tofind
402	    let	b:InPHPcode = 1
403	    let b:InPHPcode_tofind = ""
404	    let b:UserIsTypingComment = 0
405	    if cline =~ '\*/'
406		call cursor(v:lnum, 1)
407		if cline !~ '^\*/'
408		    call search('\*/', 'W')
409		endif
410		let lnum = searchpair('/\*', '', '\*/', s:searchpairflags, 'Skippmatch2()')
411
412		let b:PHP_CurrentIndentLevel = b:PHP_default_indenting
413
414		let b:PHP_LastIndentedWasComment = 0
415
416		if cline =~ '^\s*\*/'
417		    return indent(lnum) + 1
418		else
419		    return indent(lnum)
420		endif
421
422	    elseif cline =~? '<script\>'
423		let b:InPHPcode_and_script = 1
424		let b:GetLastRealCodeLNum_ADD = v:lnum
425	    endif
426	endif
427    endif
428
429    if b:InPHPcode
430
431	if !b:InPHPcode_and_script && last_line =~ '\%(<?.*\)\@<!?>\%(.*<?\)\@!' && IslinePHP(lnum, '?>')=~"Delimiter"
432	    if cline !~? s:PHP_startindenttag
433		let b:InPHPcode = 0
434		let b:InPHPcode_tofind = s:PHP_startindenttag
435	    elseif cline =~? '<script\>'
436		let b:InPHPcode_and_script = 1
437	    endif
438
439	elseif last_line =~? '<<<''\=\a\w*''\=$' " XXX 0607
440	    let b:InPHPcode = 0
441	    let b:InPHPcode_tofind = substitute( last_line, '^.*<<<''\=\(\a\w*\)''\=$', '^\\s*\1;\\=$', '') " XXX 0607
442
443	elseif !UserIsEditing && cline =~ '^\s*/\*\%(.*\*/\)\@!' && getline(v:lnum + 1) !~ '^\s*\*'
444	    let b:InPHPcode = 0
445	    let b:InPHPcode_tofind = '\*/'
446
447	elseif cline =~? '^\s*</script>'
448	    let b:InPHPcode = 0
449	    let b:InPHPcode_tofind = s:PHP_startindenttag
450	endif
451    endif " }}}
452
453
454    if !b:InPHPcode && !b:InPHPcode_and_script
455	return -1
456    endif
457
458    " Indent successive // or # comment the same way the first is {{{
459    if cline =~ '^\s*\%(//\|#\|/\*.*\*/\s*$\)'
460	if b:PHP_LastIndentedWasComment == 1
461	    return indent(real_PHP_lastindented)
462	endif
463	let b:PHP_LastIndentedWasComment = 1
464    else
465	let b:PHP_LastIndentedWasComment = 0
466    endif " }}}
467
468    " Indent multiline /* comments correctly {{{
469
470    if b:PHP_InsideMultilineComment || b:UserIsTypingComment
471	if cline =~ '^\s*\*\%(\/\)\@!'
472	    if last_line =~ '^\s*/\*'
473		return indent(lnum) + 1
474	    else
475		return indent(lnum)
476	    endif
477	else
478	    let b:PHP_InsideMultilineComment = 0
479	endif
480    endif
481
482    if !b:PHP_InsideMultilineComment && cline =~ '^\s*/\*' && cline !~ '\*/\s*$'
483	if getline(v:lnum + 1) !~ '^\s*\*'
484	    return -1
485	endif
486	let b:PHP_InsideMultilineComment = 1
487    endif " }}}
488
489
490    " Things always indented at col 1 (PHP delimiter: <?, ?>, Heredoc end) {{{
491    if cline =~# '^\s*<?' && cline !~ '?>'
492	return 0
493    endif
494
495    if  cline =~ '^\s*?>' && cline !~# '<?'
496	return 0
497    endif
498
499    if cline =~? '^\s*\a\w*;$\|^\a\w*$' && cline !~? s:notPhpHereDoc " XXX 0607
500	return 0
501    endif " }}}
502
503    let s:level = 0
504
505    let lnum = GetLastRealCodeLNum(v:lnum - 1)
506
507    let last_line = getline(lnum)
508    let ind = indent(lnum)
509    let endline= s:endline
510
511    if ind==0 && b:PHP_default_indenting
512	let ind = b:PHP_default_indenting
513    endif
514
515    if lnum == 0
516	return b:PHP_default_indenting
517    endif
518
519
520    if cline =~ '^\s*}\%(}}\)\@!'
521	let ind = indent(FindOpenBracket(v:lnum))
522	let b:PHP_CurrentIndentLevel = b:PHP_default_indenting
523	return ind
524    endif
525
526    if cline =~ '^\s*\*/'
527	call cursor(v:lnum, 1)
528	if cline !~ '^\*/'
529	    call search('\*/', 'W')
530	endif
531	let lnum = searchpair('/\*', '', '\*/', s:searchpairflags, 'Skippmatch2()')
532
533	let b:PHP_CurrentIndentLevel = b:PHP_default_indenting
534
535	if cline =~ '^\s*\*/'
536	    return indent(lnum) + 1
537	else
538	    return indent(lnum)
539	endif
540    endif
541
542    let defaultORcase = '^\s*\%(default\|case\).*:'
543
544    if last_line =~ '[;}]'.endline && last_line !~ '^)' && last_line !~# defaultORcase " Added && last_line !~ '^)' on 2007-12-30
545	if ind==b:PHP_default_indenting
546	    return b:PHP_default_indenting
547	elseif b:PHP_indentinghuge && ind==b:PHP_CurrentIndentLevel && cline !~# '^\s*\%(else\|\%(case\|default\).*:\|[})];\=\)' && last_line !~# '^\s*\%(\%(}\s*\)\=else\)' && getline(GetLastRealCodeLNum(lnum - 1))=~';'.endline
548	    return b:PHP_CurrentIndentLevel
549	endif
550    endif
551
552    let LastLineClosed = 0
553
554    let terminated = '\%(;\%(\s*?>\)\=\|<<<''\=\a\w*''\=$\|^\s*}\)'.endline " XXX 0607
555
556    let unstated   = '\%(^\s*'.s:blockstart.'.*)\|\%(//.*\)\@<!\<e'.'lse\>\)'.endline
557
558    if ind != b:PHP_default_indenting && cline =~# '^\s*else\%(if\)\=\>'
559	let b:PHP_CurrentIndentLevel = b:PHP_default_indenting
560	return indent(FindTheIfOfAnElse(v:lnum, 1))
561    elseif cline =~ '^\s*)\=\s*{'
562	let previous_line = last_line
563	let last_line_num = lnum
564
565	while last_line_num > 1
566
567	    if previous_line =~ '^\s*\%(' . s:blockstart . '\|\%([a-zA-Z]\s*\)*function\)'
568
569		let ind = indent(last_line_num)
570
571		if  b:PHP_BracesAtCodeLevel
572		    let ind = ind + &sw
573		endif
574
575		return ind
576	    endif
577
578	    let last_line_num = last_line_num - 1
579	    let previous_line = getline(last_line_num)
580	endwhile
581
582    elseif last_line =~# unstated && cline !~ '^\s*);\='.endline
583	let ind = ind + &sw " we indent one level further when the preceding line is not stated
584	return ind
585
586    elseif (ind != b:PHP_default_indenting || last_line =~ '^)' ) && last_line =~ terminated " Added || last_line =~ '^)' on 2007-12-30 (array indenting [rpblem broke other things)
587	let previous_line = last_line
588	let last_line_num = lnum
589	let LastLineClosed = 1
590
591	while 1
592	    if previous_line =~ '^\s*}'
593		let last_line_num = FindOpenBracket(last_line_num)
594
595		if getline(last_line_num) =~ '^\s*{'
596		    let last_line_num = GetLastRealCodeLNum(last_line_num - 1)
597		endif
598
599		let previous_line = getline(last_line_num)
600
601		continue
602	    else
603
604		if getline(last_line_num) =~# '^\s*else\%(if\)\=\>'
605		    let last_line_num = FindTheIfOfAnElse(last_line_num, 0)
606		    continue
607		endif
608
609
610		let last_match = last_line_num
611
612		let one_ahead_indent = indent(last_line_num)
613		let last_line_num = GetLastRealCodeLNum(last_line_num - 1)
614		let two_ahead_indent = indent(last_line_num)
615		let after_previous_line = previous_line
616		let previous_line = getline(last_line_num)
617
618
619		if previous_line =~# defaultORcase.'\|{'.endline
620		    break
621		endif
622
623		if after_previous_line=~# '^\s*'.s:blockstart.'.*)'.endline && previous_line =~# '[;}]'.endline
624		    break
625		endif
626
627		if one_ahead_indent == two_ahead_indent || last_line_num < 1
628		    if previous_line =~# '\%(;\|^\s*}\)'.endline || last_line_num < 1
629			break
630		    endif
631		endif
632	    endif
633	endwhile
634
635	if indent(last_match) != ind
636	    let ind = indent(last_match)
637	    let b:PHP_CurrentIndentLevel = b:PHP_default_indenting
638
639	    if cline =~# defaultORcase
640		let ind = ind - &sw
641	    endif
642	    return ind
643	endif
644    endif
645
646    let plinnum = GetLastRealCodeLNum(lnum - 1)
647    let pline = getline(plinnum)
648
649    let last_line = substitute(last_line,"\\(//\\|#\\)\\(\\(\\([^\"']*\\([\"']\\)[^\"']*\\5\\)\\+[^\"']*$\\)\\|\\([^\"']*$\\)\\)",'','')
650
651
652    if ind == b:PHP_default_indenting
653	if last_line =~ terminated
654	    let LastLineClosed = 1
655	endif
656    endif
657
658    if !LastLineClosed
659
660
661	if last_line =~# '[{(]'.endline || last_line =~? '\h\w*\s*(.*,$' && pline !~ '[,(]'.endline
662
663	    if !b:PHP_BracesAtCodeLevel || last_line !~# '^\s*{'
664		let ind = ind + &sw
665	    endif
666
667	    if b:PHP_BracesAtCodeLevel || b:PHP_vintage_case_default_indent == 1 || cline !~# defaultORcase
668		let b:PHP_CurrentIndentLevel = ind
669
670		return ind
671	    endif
672
673	elseif last_line =~ '\S\+\s*),'.endline
674	    call cursor(lnum, 1)
675	    call search('),'.endline, 'W')
676	    let openedparent = searchpair('(', '', ')', 'bW', 'Skippmatch()')
677	    if openedparent != lnum
678		let ind = indent(openedparent)
679	    endif
680	elseif last_line =~ '^\s*'.s:blockstart
681	    let ind = ind + &sw
682
683	elseif last_line =~# defaultORcase && cline !~# defaultORcase
684	    let ind = ind + &sw
685
686
687	elseif pline =~ '\%(;\%(\s*?>\)\=\|<<<''\=\a\w*''\=$\|^\s*}\|{\)'.endline . '\|' . defaultORcase && cline !~# defaultORcase
688
689	    let ind = ind + &sw
690	endif
691
692    endif
693
694    if cline =~  '^\s*);\='
695	let ind = ind - &sw
696    elseif cline =~# defaultORcase && last_line !~# defaultORcase
697	let ind = ind - &sw
698
699    endif
700
701    let b:PHP_CurrentIndentLevel = ind
702    return ind
703endfunction
704