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