blob: b83a1923edef4cc6f7fd6cb1ecf8c9c072741a78 [file] [log] [blame]
Bram Moolenaar071d4272004-06-13 20:20:40 +00001" Vim indent file
2" Language: PHP
Bram Moolenaar9ff70112005-07-11 22:29:03 +00003" Author: John Wellesz <John.wellesz (AT) teaser (DOT) fr>
4" URL: http://www.2072productions.com/vim/indent/php.vim
Bram Moolenaare6ae6222013-05-21 21:01:10 +02005" Home: https://github.com/2072/PHP-Indenting-for-VIm
Bram Moolenaarbcb98982014-05-01 14:08:19 +02006" Last Change: 2014 April 3rd
7" Version: 1.49
Bram Moolenaar071d4272004-06-13 20:20:40 +00008"
Bram Moolenaarc9b4b052006-04-30 18:54:39 +00009"
Bram Moolenaare6ae6222013-05-21 21:01:10 +020010" Type :help php-indent for available options
11"
12" A fully commented version of this file is available on github
Bram Moolenaara5792f52005-11-23 21:25:05 +000013"
14"
Bram Moolenaare6ae6222013-05-21 21:01:10 +020015" If you find a bug, please open a ticket on github.org
16" ( https://github.com/2072/PHP-Indenting-for-VIm/issues ) with an example of
17" code that breaks the algorithm.
Bram Moolenaar9ff70112005-07-11 22:29:03 +000018"
Bram Moolenaare6ae6222013-05-21 21:01:10 +020019
Bram Moolenaar9ff70112005-07-11 22:29:03 +000020" NOTE: This script must be used with PHP syntax ON and with the php syntax
Bram Moolenaare6ae6222013-05-21 21:01:10 +020021" script by Lutz Eymers (http://www.isp.de/data/php.vim ) or with the
Bram Moolenaarc236c162008-07-13 17:41:49 +000022" script by Peter Hodge (http://www.vim.org/scripts/script.php?script_id=1571 )
Bram Moolenaar5c736222010-01-06 20:54:52 +010023" the later is bunbdled by default with Vim 7.
Bram Moolenaar9ff70112005-07-11 22:29:03 +000024"
25"
Bram Moolenaarc236c162008-07-13 17:41:49 +000026" In the case you have syntax errors in your script such as HereDoc end
27" identifiers not at col 1 you'll have to indent your file 2 times (This
28" script will automatically put HereDoc end identifiers at col 1 if
29" they are followed by a ';').
Bram Moolenaarc9b4b052006-04-30 18:54:39 +000030"
Bram Moolenaare6ae6222013-05-21 21:01:10 +020031
Bram Moolenaar5c736222010-01-06 20:54:52 +010032" NOTE: If you are editing files in Unix file format and that (by accident)
33" there are '\r' before new lines, this script won't be able to proceed
34" correctly and will make many mistakes because it won't be able to match
35" '\s*$' correctly.
36" So you have to remove those useless characters first with a command like:
Bram Moolenaar9ff70112005-07-11 22:29:03 +000037"
Bram Moolenaar5c736222010-01-06 20:54:52 +010038" :%s /\r$//g
Bram Moolenaar9ff70112005-07-11 22:29:03 +000039"
Bram Moolenaar5c736222010-01-06 20:54:52 +010040" or simply 'let' the option PHP_removeCRwhenUnix to 1 and the script will
41" silently remove them when VIM load this script (at each bufread).
Bram Moolenaarbcb98982014-05-01 14:08:19 +020042
43
Bram Moolenaara5792f52005-11-23 21:25:05 +000044
Bram Moolenaar071d4272004-06-13 20:20:40 +000045if exists("b:did_indent")
Bram Moolenaar1e015462005-09-25 22:16:38 +000046 finish
Bram Moolenaar071d4272004-06-13 20:20:40 +000047endif
48let b:did_indent = 1
49
Bram Moolenaar9ff70112005-07-11 22:29:03 +000050
51let php_sync_method = 0
52
53
Bram Moolenaare6ae6222013-05-21 21:01:10 +020054
Bram Moolenaar9ff70112005-07-11 22:29:03 +000055if exists("PHP_default_indenting")
Bram Moolenaar1e015462005-09-25 22:16:38 +000056 let b:PHP_default_indenting = PHP_default_indenting * &sw
Bram Moolenaar9ff70112005-07-11 22:29:03 +000057else
Bram Moolenaar1e015462005-09-25 22:16:38 +000058 let b:PHP_default_indenting = 0
Bram Moolenaar9ff70112005-07-11 22:29:03 +000059endif
60
Bram Moolenaare6ae6222013-05-21 21:01:10 +020061if exists("PHP_outdentSLComments")
62 let b:PHP_outdentSLComments = PHP_outdentSLComments * &sw
63else
64 let b:PHP_outdentSLComments = 0
65endif
66
Bram Moolenaar9ff70112005-07-11 22:29:03 +000067if exists("PHP_BracesAtCodeLevel")
Bram Moolenaar1e015462005-09-25 22:16:38 +000068 let b:PHP_BracesAtCodeLevel = PHP_BracesAtCodeLevel
Bram Moolenaar9ff70112005-07-11 22:29:03 +000069else
Bram Moolenaar1e015462005-09-25 22:16:38 +000070 let b:PHP_BracesAtCodeLevel = 0
Bram Moolenaar9ff70112005-07-11 22:29:03 +000071endif
72
Bram Moolenaarc236c162008-07-13 17:41:49 +000073
Bram Moolenaara5792f52005-11-23 21:25:05 +000074if exists("PHP_autoformatcomment")
75 let b:PHP_autoformatcomment = PHP_autoformatcomment
76else
77 let b:PHP_autoformatcomment = 1
78endif
Bram Moolenaar9ff70112005-07-11 22:29:03 +000079
Bram Moolenaar8408a9a2010-07-30 22:41:22 +020080if exists("PHP_outdentphpescape")
81 let b:PHP_outdentphpescape = PHP_outdentphpescape
82else
83 let b:PHP_outdentphpescape = 1
84endif
85
86
87if exists("PHP_vintage_case_default_indent") && PHP_vintage_case_default_indent
88 let b:PHP_vintage_case_default_indent = 1
Bram Moolenaarc236c162008-07-13 17:41:49 +000089else
90 let b:PHP_vintage_case_default_indent = 0
91endif
92
93
94
Bram Moolenaar9ff70112005-07-11 22:29:03 +000095let b:PHP_lastindented = 0
96let b:PHP_indentbeforelast = 0
97let b:PHP_indentinghuge = 0
98let b:PHP_CurrentIndentLevel = b:PHP_default_indenting
99let b:PHP_LastIndentedWasComment = 0
100let b:PHP_InsideMultilineComment = 0
101let b:InPHPcode = 0
102let b:InPHPcode_checked = 0
103let b:InPHPcode_and_script = 0
104let b:InPHPcode_tofind = ""
105let b:PHP_oldchangetick = b:changedtick
106let b:UserIsTypingComment = 0
107let b:optionsset = 0
108
109setlocal nosmartindent
Bram Moolenaarc9b4b052006-04-30 18:54:39 +0000110setlocal noautoindent
Bram Moolenaar9ff70112005-07-11 22:29:03 +0000111setlocal nocindent
Bram Moolenaar1e015462005-09-25 22:16:38 +0000112setlocal nolisp
Bram Moolenaar9ff70112005-07-11 22:29:03 +0000113
Bram Moolenaar071d4272004-06-13 20:20:40 +0000114setlocal indentexpr=GetPhpIndent()
Bram Moolenaar9ff70112005-07-11 22:29:03 +0000115setlocal indentkeys=0{,0},0),:,!^F,o,O,e,*<Return>,=?>,=<?,=*/
Bram Moolenaar071d4272004-06-13 20:20:40 +0000116
Bram Moolenaar9ff70112005-07-11 22:29:03 +0000117
Bram Moolenaar1e015462005-09-25 22:16:38 +0000118
119let s:searchpairflags = 'bWr'
Bram Moolenaar9ff70112005-07-11 22:29:03 +0000120
121if &fileformat == "unix" && exists("PHP_removeCRwhenUnix") && PHP_removeCRwhenUnix
Bram Moolenaar1e015462005-09-25 22:16:38 +0000122 silent! %s/\r$//g
Bram Moolenaar9ff70112005-07-11 22:29:03 +0000123endif
124
Bram Moolenaar071d4272004-06-13 20:20:40 +0000125if exists("*GetPhpIndent")
Bram Moolenaar5c736222010-01-06 20:54:52 +0100126 call ResetPhpOptions()
Bram Moolenaare6ae6222013-05-21 21:01:10 +0200127 finish " XXX -- comment this line for easy dev
Bram Moolenaar071d4272004-06-13 20:20:40 +0000128endif
129
Bram Moolenaarbcb98982014-05-01 14:08:19 +0200130
131let s:notPhpHereDoc = '\%(break\|return\|continue\|exit\|die\|else\)'
132let s:blockstart = '\%(\%(\%(}\s*\)\=else\%(\s\+\)\=\)\=if\>\|\%(}\s*\)\?else\>\|do\>\|while\>\|switch\>\|case\>\|default\>\|for\%(each\)\=\>\|declare\>\|class\>\|trait\>\|use\>\|interface\>\|abstract\>\|final\>\|try\>\|\%(}\s*\)\=catch\>\|\%(}\s*\)\=finally\>\)'
133let s:functionDecl = '\<function\>\%(\s\+[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*\)\=\s*(.*'
Bram Moolenaar9ff70112005-07-11 22:29:03 +0000134let s:endline= '\s*\%(//.*\|#.*\|/\*.*\*/\s*\)\=$'
Bram Moolenaarbcb98982014-05-01 14:08:19 +0200135let s:terminated = '\%(\%(;\%(\s*\%(?>\|}\)\)\=\|<<<''\=\a\w*''\=$\|^\s*}\)'.s:endline.'\)\|^[^''"`]*[''"`]$'
Bram Moolenaar9ff70112005-07-11 22:29:03 +0000136let s:PHP_startindenttag = '<?\%(.*?>\)\@!\|<script[^>]*>\%(.*<\/script>\)\@!'
Bram Moolenaar071d4272004-06-13 20:20:40 +0000137
Bram Moolenaar9ff70112005-07-11 22:29:03 +0000138
Bram Moolenaarbcb98982014-05-01 14:08:19 +0200139
140let s:escapeDebugStops = 0
Bram Moolenaare6ae6222013-05-21 21:01:10 +0200141function! DebugPrintReturn(scriptLine)
142
Bram Moolenaarbcb98982014-05-01 14:08:19 +0200143 if ! s:escapeDebugStops
144 echo "debug:" . a:scriptLine
145 let c = getchar()
146 if c == "\<Del>"
147 let s:escapeDebugStops = 1
148 end
149 endif
Bram Moolenaare6ae6222013-05-21 21:01:10 +0200150
151endfunction
152
Bram Moolenaar9ff70112005-07-11 22:29:03 +0000153function! GetLastRealCodeLNum(startline) " {{{
Bram Moolenaarc9b4b052006-04-30 18:54:39 +0000154
Bram Moolenaar1e015462005-09-25 22:16:38 +0000155 let lnum = a:startline
Bram Moolenaarc9b4b052006-04-30 18:54:39 +0000156
Bram Moolenaar05a7bb32006-01-19 22:09:32 +0000157 if b:GetLastRealCodeLNum_ADD && b:GetLastRealCodeLNum_ADD == lnum + 1
158 let lnum = b:GetLastRealCodeLNum_ADD
159 endif
Bram Moolenaarc9b4b052006-04-30 18:54:39 +0000160
Bram Moolenaar1e015462005-09-25 22:16:38 +0000161 let old_lnum = lnum
Bram Moolenaar9ff70112005-07-11 22:29:03 +0000162
Bram Moolenaar1e015462005-09-25 22:16:38 +0000163 while lnum > 1
164 let lnum = prevnonblank(lnum)
165 let lastline = getline(lnum)
166
167 if b:InPHPcode_and_script && lastline =~ '?>\s*$'
168 let lnum = lnum - 1
169 elseif lastline =~ '^\s*?>.*<?\%(php\)\=\s*$'
170 let lnum = lnum - 1
171 elseif lastline =~ '^\s*\%(//\|#\|/\*.*\*/\s*$\)'
172 let lnum = lnum - 1
173 elseif lastline =~ '\*/\s*$'
174 call cursor(lnum, 1)
175 if lastline !~ '^\*/'
176 call search('\*/', 'W')
177 endif
Bram Moolenaara5792f52005-11-23 21:25:05 +0000178 let lnum = searchpair('/\*', '', '\*/', s:searchpairflags, 'Skippmatch2()')
Bram Moolenaar1e015462005-09-25 22:16:38 +0000179
180 let lastline = getline(lnum)
181 if lastline =~ '^\s*/\*'
182 let lnum = lnum - 1
183 else
184 break
185 endif
186
187
188 elseif lastline =~? '\%(//\s*\|?>.*\)\@<!<?\%(php\)\=\s*$\|^\s*<script\>'
189
190 while lastline !~ '\(<?.*\)\@<!?>' && lnum > 1
191 let lnum = lnum - 1
Bram Moolenaar9ff70112005-07-11 22:29:03 +0000192 let lastline = getline(lnum)
Bram Moolenaar1e015462005-09-25 22:16:38 +0000193 endwhile
194 if lastline =~ '^\s*?>'
195 let lnum = lnum - 1
196 else
197 break
198 endif
Bram Moolenaar9ff70112005-07-11 22:29:03 +0000199
200
Bram Moolenaar8408a9a2010-07-30 22:41:22 +0200201 elseif lastline =~? '^\a\w*;\=$' && lastline !~? s:notPhpHereDoc
202 let tofind=substitute( lastline, '\(\a\w*\);\=', '<<<''\\=\1''\\=$', '')
Bram Moolenaar1e015462005-09-25 22:16:38 +0000203 while getline(lnum) !~? tofind && lnum > 1
204 let lnum = lnum - 1
205 endwhile
Bram Moolenaarbcb98982014-05-01 14:08:19 +0200206 elseif lastline =~ '^[^''"`]*[''"`][;,]'.s:endline
207 let tofind=substitute( lastline, '^.*\([''"`]\)[;,].*$', '^[^\1]\\+[\1]$', '')
208 while getline(lnum) !~? tofind && lnum > 1
209 let lnum = lnum - 1
210 endwhile
Bram Moolenaar1e015462005-09-25 22:16:38 +0000211 else
Bram Moolenaarc9b4b052006-04-30 18:54:39 +0000212 break
Bram Moolenaar9ff70112005-07-11 22:29:03 +0000213 endif
Bram Moolenaar1e015462005-09-25 22:16:38 +0000214 endwhile
215
Bram Moolenaar8408a9a2010-07-30 22:41:22 +0200216 if lnum==1 && getline(lnum) !~ '<?'
Bram Moolenaar1e015462005-09-25 22:16:38 +0000217 let lnum=0
218 endif
219
220 if b:InPHPcode_and_script && !b:InPHPcode
221 let b:InPHPcode_and_script = 0
222 endif
Bram Moolenaard5ab34b2007-05-05 17:15:44 +0000223
Bram Moolenaar1e015462005-09-25 22:16:38 +0000224 return lnum
225endfunction " }}}
Bram Moolenaar9ff70112005-07-11 22:29:03 +0000226
Bram Moolenaara5792f52005-11-23 21:25:05 +0000227function! Skippmatch2()
228
229 let line = getline(".")
230
Bram Moolenaare6ae6222013-05-21 21:01:10 +0200231 if line =~ "\\([\"']\\).*/\\*.*\\1" || line =~ '\%(//\|#\).*/\*'
Bram Moolenaarbcb98982014-05-01 14:08:19 +0200232 return 1
Bram Moolenaare6ae6222013-05-21 21:01:10 +0200233 else
Bram Moolenaarbcb98982014-05-01 14:08:19 +0200234 return 0
Bram Moolenaare6ae6222013-05-21 21:01:10 +0200235 endif
Bram Moolenaara5792f52005-11-23 21:25:05 +0000236endfun
237
Bram Moolenaar8408a9a2010-07-30 22:41:22 +0200238function! Skippmatch() " {{{
Bram Moolenaar1e015462005-09-25 22:16:38 +0000239 let synname = synIDattr(synID(line("."), col("."), 0), "name")
Bram Moolenaarc236c162008-07-13 17:41:49 +0000240 if synname == "Delimiter" || synname == "phpRegionDelimiter" || synname =~# "^phpParent" || synname == "phpArrayParens" || synname =~# '^php\%(Block\|Brace\)' || synname == "javaScriptBraces" || synname =~# "^phpComment" && b:UserIsTypingComment
Bram Moolenaar1e015462005-09-25 22:16:38 +0000241 return 0
242 else
243 return 1
244 endif
245endfun " }}}
Bram Moolenaar9ff70112005-07-11 22:29:03 +0000246
Bram Moolenaarbcb98982014-05-01 14:08:19 +0200247function! FindOpenBracket(lnum, blockStarter) " {{{
Bram Moolenaar1e015462005-09-25 22:16:38 +0000248 call cursor(a:lnum, 1)
Bram Moolenaarbcb98982014-05-01 14:08:19 +0200249 let line = searchpair('{', '', '}', 'bW', 'Skippmatch()')
250
251 if a:blockStarter == 1
252 while line > 1
253 let linec = getline(line)
254
255 if linec =~ s:terminated || linec =~ '^\s*\%(' . s:blockstart . '\)\|'. s:functionDecl . s:endline
256 break
257 endif
258
259 let line = GetLastRealCodeLNum(line - 1)
260 endwhile
261 endif
262
263 return line
Bram Moolenaar1e015462005-09-25 22:16:38 +0000264endfun " }}}
Bram Moolenaar9ff70112005-07-11 22:29:03 +0000265
266function! FindTheIfOfAnElse (lnum, StopAfterFirstPrevElse) " {{{
Bram Moolenaar1e015462005-09-25 22:16:38 +0000267
268 if getline(a:lnum) =~# '^\s*}\s*else\%(if\)\=\>'
269 let beforeelse = a:lnum
270 else
271 let beforeelse = GetLastRealCodeLNum(a:lnum - 1)
272 endif
273
274 if !s:level
275 let s:iftoskip = 0
276 endif
277
278 if getline(beforeelse) =~# '^\s*\%(}\s*\)\=else\%(\s*if\)\@!\>'
279 let s:iftoskip = s:iftoskip + 1
280 endif
281
282 if getline(beforeelse) =~ '^\s*}'
Bram Moolenaarbcb98982014-05-01 14:08:19 +0200283 let beforeelse = FindOpenBracket(beforeelse, 0)
Bram Moolenaar1e015462005-09-25 22:16:38 +0000284
285 if getline(beforeelse) =~ '^\s*{'
286 let beforeelse = GetLastRealCodeLNum(beforeelse - 1)
Bram Moolenaar9ff70112005-07-11 22:29:03 +0000287 endif
Bram Moolenaar1e015462005-09-25 22:16:38 +0000288 endif
Bram Moolenaar9ff70112005-07-11 22:29:03 +0000289
290
Bram Moolenaar1e015462005-09-25 22:16:38 +0000291 if !s:iftoskip && a:StopAfterFirstPrevElse && getline(beforeelse) =~# '^\s*\%([}]\s*\)\=else\%(if\)\=\>'
Bram Moolenaar9ff70112005-07-11 22:29:03 +0000292 return beforeelse
Bram Moolenaar1e015462005-09-25 22:16:38 +0000293 endif
Bram Moolenaar9ff70112005-07-11 22:29:03 +0000294
Bram Moolenaar1e015462005-09-25 22:16:38 +0000295 if getline(beforeelse) !~# '^\s*if\>' && beforeelse>1 || s:iftoskip && beforeelse>1
296
Bram Moolenaar8408a9a2010-07-30 22:41:22 +0200297 if s:iftoskip && getline(beforeelse) =~# '^\s*if\>'
Bram Moolenaar1e015462005-09-25 22:16:38 +0000298 let s:iftoskip = s:iftoskip - 1
299 endif
300
301 let s:level = s:level + 1
302 let beforeelse = FindTheIfOfAnElse(beforeelse, a:StopAfterFirstPrevElse)
303 endif
304
305 return beforeelse
306
307endfunction " }}}
Bram Moolenaar9ff70112005-07-11 22:29:03 +0000308
Bram Moolenaar8408a9a2010-07-30 22:41:22 +0200309let s:defaultORcase = '^\s*\%(default\|case\).*:'
310
311function! FindTheSwitchIndent (lnum) " {{{
312
313
314 let test = GetLastRealCodeLNum(a:lnum - 1)
315
316 if test <= 1
317 return indent(1) - &sw * b:PHP_vintage_case_default_indent
318 end
319
Bram Moolenaarbcb98982014-05-01 14:08:19 +0200320 while getline(test) =~ '^\s*}' && test > 1
321 let test = GetLastRealCodeLNum(FindOpenBracket(test, 0) - 1)
Bram Moolenaar8408a9a2010-07-30 22:41:22 +0200322
Bram Moolenaarbcb98982014-05-01 14:08:19 +0200323 if getline(test) =~ '^\s*switch\>'
324 let test = GetLastRealCodeLNum(test - 1)
Bram Moolenaar8408a9a2010-07-30 22:41:22 +0200325 endif
Bram Moolenaarbcb98982014-05-01 14:08:19 +0200326 endwhile
Bram Moolenaar8408a9a2010-07-30 22:41:22 +0200327
328 if getline(test) =~# '^\s*switch\>'
329 return indent(test)
330 elseif getline(test) =~# s:defaultORcase
331 return indent(test) - &sw * b:PHP_vintage_case_default_indent
332 else
333 return FindTheSwitchIndent(test)
334 endif
335
336endfunction "}}}
337
Bram Moolenaar3b1db362013-08-10 15:00:24 +0200338let s:SynPHPMatchGroups = {'phpParent':1, 'Delimiter':1, 'Define':1, 'Storageclass':1, 'StorageClass':1, 'Structure':1, 'Exception':1}
Bram Moolenaar9ff70112005-07-11 22:29:03 +0000339function! IslinePHP (lnum, tofind) " {{{
Bram Moolenaar1e015462005-09-25 22:16:38 +0000340 let cline = getline(a:lnum)
Bram Moolenaar9ff70112005-07-11 22:29:03 +0000341
Bram Moolenaar1e015462005-09-25 22:16:38 +0000342 if a:tofind==""
Bram Moolenaarbcb98982014-05-01 14:08:19 +0200343 let tofind = "^\\s*[\"'`]*\\s*\\zs\\S"
Bram Moolenaar1e015462005-09-25 22:16:38 +0000344 else
345 let tofind = a:tofind
346 endif
Bram Moolenaar9ff70112005-07-11 22:29:03 +0000347
Bram Moolenaar1e015462005-09-25 22:16:38 +0000348 let tofind = tofind . '\c'
Bram Moolenaar9ff70112005-07-11 22:29:03 +0000349
Bram Moolenaar1e015462005-09-25 22:16:38 +0000350 let coltotest = match (cline, tofind) + 1
Bram Moolenaar9ff70112005-07-11 22:29:03 +0000351
Bram Moolenaar1e015462005-09-25 22:16:38 +0000352 let synname = synIDattr(synID(a:lnum, coltotest, 0), "name")
353
Bram Moolenaarbcb98982014-05-01 14:08:19 +0200354 if synname == 'phpStringSingle' || synname == 'phpStringDouble' || synname == 'phpBacktick'
355 if cline !~ '^\s*[''"`]'
356 return ""
357 else
358 return synname
359 end
360 end
361
Bram Moolenaar9d98fe92013-08-03 18:35:36 +0200362 if get(s:SynPHPMatchGroups, synname) || synname =~ '^php' || synname =~? '^javaScript'
Bram Moolenaar1e015462005-09-25 22:16:38 +0000363 return synname
364 else
365 return ""
366 endif
367endfunction " }}}
Bram Moolenaar9ff70112005-07-11 22:29:03 +0000368
Bram Moolenaar5c736222010-01-06 20:54:52 +0100369let s:autoresetoptions = 0
370if ! s:autoresetoptions
371 let s:autoresetoptions = 1
Bram Moolenaar9ff70112005-07-11 22:29:03 +0000372endif
373
Bram Moolenaar5c736222010-01-06 20:54:52 +0100374function! ResetPhpOptions()
Bram Moolenaar8408a9a2010-07-30 22:41:22 +0200375 if ! b:optionsset && &filetype == "php"
Bram Moolenaara5792f52005-11-23 21:25:05 +0000376 if b:PHP_autoformatcomment
377
378 setlocal comments=s1:/*,mb:*,ex:*/,://,:#
Bram Moolenaarc9b4b052006-04-30 18:54:39 +0000379
Bram Moolenaarc236c162008-07-13 17:41:49 +0000380 setlocal formatoptions-=t
Bram Moolenaara5792f52005-11-23 21:25:05 +0000381 setlocal formatoptions+=q
382 setlocal formatoptions+=r
383 setlocal formatoptions+=o
Bram Moolenaara5792f52005-11-23 21:25:05 +0000384 setlocal formatoptions+=c
385 setlocal formatoptions+=b
386 endif
Bram Moolenaar1e015462005-09-25 22:16:38 +0000387 let b:optionsset = 1
388 endif
Bram Moolenaar9ff70112005-07-11 22:29:03 +0000389endfunc
390
Bram Moolenaar5c736222010-01-06 20:54:52 +0100391call ResetPhpOptions()
392
Bram Moolenaar9ff70112005-07-11 22:29:03 +0000393function! GetPhpIndent()
Bram Moolenaar9ff70112005-07-11 22:29:03 +0000394
Bram Moolenaar05a7bb32006-01-19 22:09:32 +0000395 let b:GetLastRealCodeLNum_ADD = 0
396
Bram Moolenaar1e015462005-09-25 22:16:38 +0000397 let UserIsEditing=0
398 if b:PHP_oldchangetick != b:changedtick
399 let b:PHP_oldchangetick = b:changedtick
400 let UserIsEditing=1
401 endif
402
403 if b:PHP_default_indenting
404 let b:PHP_default_indenting = g:PHP_default_indenting * &sw
405 endif
406
407 let cline = getline(v:lnum)
408
Bram Moolenaarc9b4b052006-04-30 18:54:39 +0000409 if !b:PHP_indentinghuge && b:PHP_lastindented > b:PHP_indentbeforelast
Bram Moolenaar1e015462005-09-25 22:16:38 +0000410 if b:PHP_indentbeforelast
411 let b:PHP_indentinghuge = 1
Bram Moolenaar9ff70112005-07-11 22:29:03 +0000412 endif
Bram Moolenaar1e015462005-09-25 22:16:38 +0000413 let b:PHP_indentbeforelast = b:PHP_lastindented
414 endif
Bram Moolenaar9ff70112005-07-11 22:29:03 +0000415
Bram Moolenaar1e015462005-09-25 22:16:38 +0000416 if b:InPHPcode_checked && prevnonblank(v:lnum - 1) != b:PHP_lastindented
417 if b:PHP_indentinghuge
Bram Moolenaar1e015462005-09-25 22:16:38 +0000418 let b:PHP_indentinghuge = 0
419 let b:PHP_CurrentIndentLevel = b:PHP_default_indenting
Bram Moolenaar9ff70112005-07-11 22:29:03 +0000420 endif
Bram Moolenaar1e015462005-09-25 22:16:38 +0000421 let b:PHP_lastindented = v:lnum
422 let b:PHP_LastIndentedWasComment=0
423 let b:PHP_InsideMultilineComment=0
424 let b:PHP_indentbeforelast = 0
Bram Moolenaar9ff70112005-07-11 22:29:03 +0000425
Bram Moolenaar1e015462005-09-25 22:16:38 +0000426 let b:InPHPcode = 0
427 let b:InPHPcode_checked = 0
428 let b:InPHPcode_and_script = 0
429 let b:InPHPcode_tofind = ""
Bram Moolenaar9ff70112005-07-11 22:29:03 +0000430
Bram Moolenaar1e015462005-09-25 22:16:38 +0000431 elseif v:lnum > b:PHP_lastindented
432 let real_PHP_lastindented = b:PHP_lastindented
433 let b:PHP_lastindented = v:lnum
434 endif
Bram Moolenaar9ff70112005-07-11 22:29:03 +0000435
Bram Moolenaar1e015462005-09-25 22:16:38 +0000436
437 if !b:InPHPcode_checked " {{{ One time check
438 let b:InPHPcode_checked = 1
439
Bram Moolenaar05a7bb32006-01-19 22:09:32 +0000440 let synname = ""
441 if cline !~ '<?.*?>'
442 let synname = IslinePHP (prevnonblank(v:lnum), "")
443 endif
Bram Moolenaar1e015462005-09-25 22:16:38 +0000444
445 if synname!=""
Bram Moolenaard5ab34b2007-05-05 17:15:44 +0000446 if synname != "phpHereDoc" && synname != "phpHereDocDelimiter"
Bram Moolenaar1e015462005-09-25 22:16:38 +0000447 let b:InPHPcode = 1
Bram Moolenaar9ff70112005-07-11 22:29:03 +0000448 let b:InPHPcode_tofind = ""
449
Bram Moolenaarc236c162008-07-13 17:41:49 +0000450 if synname =~# "^phpComment"
Bram Moolenaar1e015462005-09-25 22:16:38 +0000451 let b:UserIsTypingComment = 1
Bram Moolenaar9ff70112005-07-11 22:29:03 +0000452 else
Bram Moolenaar1e015462005-09-25 22:16:38 +0000453 let b:UserIsTypingComment = 0
Bram Moolenaar9ff70112005-07-11 22:29:03 +0000454 endif
Bram Moolenaar9ff70112005-07-11 22:29:03 +0000455
Bram Moolenaar1e015462005-09-25 22:16:38 +0000456 if synname =~? '^javaScript'
457 let b:InPHPcode_and_script = 1
Bram Moolenaar9ff70112005-07-11 22:29:03 +0000458 endif
Bram Moolenaar9ff70112005-07-11 22:29:03 +0000459
Bram Moolenaar1e015462005-09-25 22:16:38 +0000460 else
461 let b:InPHPcode = 0
462 let b:UserIsTypingComment = 0
Bram Moolenaar9ff70112005-07-11 22:29:03 +0000463
Bram Moolenaar1e015462005-09-25 22:16:38 +0000464 let lnum = v:lnum - 1
Bram Moolenaarc236c162008-07-13 17:41:49 +0000465 while getline(lnum) !~? '<<<''\=\a\w*''\=$' && lnum > 1
Bram Moolenaar1e015462005-09-25 22:16:38 +0000466 let lnum = lnum - 1
Bram Moolenaar9ff70112005-07-11 22:29:03 +0000467 endwhile
468
Bram Moolenaar8408a9a2010-07-30 22:41:22 +0200469 let b:InPHPcode_tofind = substitute( getline(lnum), '^.*<<<''\=\(\a\w*\)''\=$', '^\\s*\1;\\=$', '')
Bram Moolenaar1e015462005-09-25 22:16:38 +0000470 endif
471 else
472 let b:InPHPcode = 0
473 let b:UserIsTypingComment = 0
Bram Moolenaare6ae6222013-05-21 21:01:10 +0200474 let b:InPHPcode_tofind = s:PHP_startindenttag
Bram Moolenaar9ff70112005-07-11 22:29:03 +0000475 endif
Bram Moolenaar1e015462005-09-25 22:16:38 +0000476 endif "!b:InPHPcode_checked }}}
Bram Moolenaar9ff70112005-07-11 22:29:03 +0000477
478
Bram Moolenaar1e015462005-09-25 22:16:38 +0000479 " Test if we are indenting PHP code {{{
480 let lnum = prevnonblank(v:lnum - 1)
481 let last_line = getline(lnum)
Bram Moolenaarbcb98982014-05-01 14:08:19 +0200482 let endline= s:endline
Bram Moolenaar1e015462005-09-25 22:16:38 +0000483
484 if b:InPHPcode_tofind!=""
485 if cline =~? b:InPHPcode_tofind
Bram Moolenaar8408a9a2010-07-30 22:41:22 +0200486 let b:InPHPcode = 1
Bram Moolenaar1e015462005-09-25 22:16:38 +0000487 let b:InPHPcode_tofind = ""
488 let b:UserIsTypingComment = 0
489 if cline =~ '\*/'
490 call cursor(v:lnum, 1)
491 if cline !~ '^\*/'
492 call search('\*/', 'W')
Bram Moolenaar9ff70112005-07-11 22:29:03 +0000493 endif
Bram Moolenaara5792f52005-11-23 21:25:05 +0000494 let lnum = searchpair('/\*', '', '\*/', s:searchpairflags, 'Skippmatch2()')
Bram Moolenaar9ff70112005-07-11 22:29:03 +0000495
Bram Moolenaar1e015462005-09-25 22:16:38 +0000496 let b:PHP_CurrentIndentLevel = b:PHP_default_indenting
Bram Moolenaar9ff70112005-07-11 22:29:03 +0000497
Bram Moolenaar1e015462005-09-25 22:16:38 +0000498 let b:PHP_LastIndentedWasComment = 0
Bram Moolenaar9ff70112005-07-11 22:29:03 +0000499
Bram Moolenaar1e015462005-09-25 22:16:38 +0000500 if cline =~ '^\s*\*/'
501 return indent(lnum) + 1
502 else
503 return indent(lnum)
Bram Moolenaar9ff70112005-07-11 22:29:03 +0000504 endif
505
Bram Moolenaar1e015462005-09-25 22:16:38 +0000506 elseif cline =~? '<script\>'
507 let b:InPHPcode_and_script = 1
Bram Moolenaar05a7bb32006-01-19 22:09:32 +0000508 let b:GetLastRealCodeLNum_ADD = v:lnum
Bram Moolenaar1e015462005-09-25 22:16:38 +0000509 endif
Bram Moolenaar9ff70112005-07-11 22:29:03 +0000510 endif
Bram Moolenaar1e015462005-09-25 22:16:38 +0000511 endif
Bram Moolenaar9ff70112005-07-11 22:29:03 +0000512
Bram Moolenaar1e015462005-09-25 22:16:38 +0000513 if b:InPHPcode
514
Bram Moolenaard5ab34b2007-05-05 17:15:44 +0000515 if !b:InPHPcode_and_script && last_line =~ '\%(<?.*\)\@<!?>\%(.*<?\)\@!' && IslinePHP(lnum, '?>')=~"Delimiter"
Bram Moolenaar1e015462005-09-25 22:16:38 +0000516 if cline !~? s:PHP_startindenttag
517 let b:InPHPcode = 0
518 let b:InPHPcode_tofind = s:PHP_startindenttag
519 elseif cline =~? '<script\>'
520 let b:InPHPcode_and_script = 1
521 endif
522
Bram Moolenaarbcb98982014-05-01 14:08:19 +0200523 elseif last_line =~ '^[^''"`]\+[''"`]$' " a string identifier with nothing after it and no other string identifier before
524 let b:InPHPcode = 0
525 let b:InPHPcode_tofind = substitute( last_line, '^.*\([''"`]\).*$', '^[^\1]*\1[;,]$', '')
Bram Moolenaar8408a9a2010-07-30 22:41:22 +0200526 elseif last_line =~? '<<<''\=\a\w*''\=$'
Bram Moolenaar1e015462005-09-25 22:16:38 +0000527 let b:InPHPcode = 0
Bram Moolenaar8408a9a2010-07-30 22:41:22 +0200528 let b:InPHPcode_tofind = substitute( last_line, '^.*<<<''\=\(\a\w*\)''\=$', '^\\s*\1;\\=$', '')
Bram Moolenaar1e015462005-09-25 22:16:38 +0000529
530 elseif !UserIsEditing && cline =~ '^\s*/\*\%(.*\*/\)\@!' && getline(v:lnum + 1) !~ '^\s*\*'
531 let b:InPHPcode = 0
532 let b:InPHPcode_tofind = '\*/'
533
534 elseif cline =~? '^\s*</script>'
535 let b:InPHPcode = 0
536 let b:InPHPcode_tofind = s:PHP_startindenttag
Bram Moolenaar9ff70112005-07-11 22:29:03 +0000537 endif
Bram Moolenaar1e015462005-09-25 22:16:38 +0000538 endif " }}}
Bram Moolenaar9ff70112005-07-11 22:29:03 +0000539
Bram Moolenaarc9b4b052006-04-30 18:54:39 +0000540
Bram Moolenaar1e015462005-09-25 22:16:38 +0000541 if !b:InPHPcode && !b:InPHPcode_and_script
542 return -1
543 endif
544
Bram Moolenaar1e015462005-09-25 22:16:38 +0000545 " Indent successive // or # comment the same way the first is {{{
Bram Moolenaare6ae6222013-05-21 21:01:10 +0200546 let addSpecial = 0
Bram Moolenaar1e015462005-09-25 22:16:38 +0000547 if cline =~ '^\s*\%(//\|#\|/\*.*\*/\s*$\)'
Bram Moolenaare6ae6222013-05-21 21:01:10 +0200548 let addSpecial = b:PHP_outdentSLComments
Bram Moolenaar1e015462005-09-25 22:16:38 +0000549 if b:PHP_LastIndentedWasComment == 1
550 return indent(real_PHP_lastindented)
551 endif
552 let b:PHP_LastIndentedWasComment = 1
553 else
554 let b:PHP_LastIndentedWasComment = 0
555 endif " }}}
556
557 " Indent multiline /* comments correctly {{{
558
559 if b:PHP_InsideMultilineComment || b:UserIsTypingComment
560 if cline =~ '^\s*\*\%(\/\)\@!'
561 if last_line =~ '^\s*/\*'
562 return indent(lnum) + 1
563 else
564 return indent(lnum)
565 endif
566 else
567 let b:PHP_InsideMultilineComment = 0
568 endif
569 endif
570
Bram Moolenaar05a7bb32006-01-19 22:09:32 +0000571 if !b:PHP_InsideMultilineComment && cline =~ '^\s*/\*' && cline !~ '\*/\s*$'
572 if getline(v:lnum + 1) !~ '^\s*\*'
573 return -1
574 endif
Bram Moolenaar1e015462005-09-25 22:16:38 +0000575 let b:PHP_InsideMultilineComment = 1
Bram Moolenaar1e015462005-09-25 22:16:38 +0000576 endif " }}}
577
578
579 " Things always indented at col 1 (PHP delimiter: <?, ?>, Heredoc end) {{{
Bram Moolenaar8408a9a2010-07-30 22:41:22 +0200580 if cline =~# '^\s*<?' && cline !~ '?>' && b:PHP_outdentphpescape
Bram Moolenaar1e015462005-09-25 22:16:38 +0000581 return 0
582 endif
583
Bram Moolenaar8408a9a2010-07-30 22:41:22 +0200584 if cline =~ '^\s*?>' && cline !~# '<?' && b:PHP_outdentphpescape
Bram Moolenaar1e015462005-09-25 22:16:38 +0000585 return 0
586 endif
587
Bram Moolenaarbcb98982014-05-01 14:08:19 +0200588 if cline =~? '^\s*\a\w*;$\|^\a\w*$\|^\s*[''"`][;,]' && cline !~? s:notPhpHereDoc
Bram Moolenaar1e015462005-09-25 22:16:38 +0000589 return 0
590 endif " }}}
591
592 let s:level = 0
593
594 let lnum = GetLastRealCodeLNum(v:lnum - 1)
Bram Moolenaar05a7bb32006-01-19 22:09:32 +0000595
Bram Moolenaar1e015462005-09-25 22:16:38 +0000596 let last_line = getline(lnum)
597 let ind = indent(lnum)
Bram Moolenaar1e015462005-09-25 22:16:38 +0000598
599 if ind==0 && b:PHP_default_indenting
600 let ind = b:PHP_default_indenting
601 endif
602
603 if lnum == 0
Bram Moolenaare6ae6222013-05-21 21:01:10 +0200604 return b:PHP_default_indenting + addSpecial
Bram Moolenaar1e015462005-09-25 22:16:38 +0000605 endif
606
607
608 if cline =~ '^\s*}\%(}}\)\@!'
Bram Moolenaarbcb98982014-05-01 14:08:19 +0200609 let ind = indent(FindOpenBracket(v:lnum, 1))
Bram Moolenaar1e015462005-09-25 22:16:38 +0000610 let b:PHP_CurrentIndentLevel = b:PHP_default_indenting
Bram Moolenaar9ff70112005-07-11 22:29:03 +0000611 return ind
Bram Moolenaar1e015462005-09-25 22:16:38 +0000612 endif
613
614 if cline =~ '^\s*\*/'
615 call cursor(v:lnum, 1)
616 if cline !~ '^\*/'
617 call search('\*/', 'W')
618 endif
Bram Moolenaara5792f52005-11-23 21:25:05 +0000619 let lnum = searchpair('/\*', '', '\*/', s:searchpairflags, 'Skippmatch2()')
Bram Moolenaar1e015462005-09-25 22:16:38 +0000620
621 let b:PHP_CurrentIndentLevel = b:PHP_default_indenting
622
623 if cline =~ '^\s*\*/'
624 return indent(lnum) + 1
625 else
626 return indent(lnum)
627 endif
628 endif
629
Bram Moolenaar1e015462005-09-25 22:16:38 +0000630
Bram Moolenaare6ae6222013-05-21 21:01:10 +0200631 if last_line =~ '[;}]'.endline && last_line !~ '^[)\]]' && last_line !~# s:defaultORcase
Bram Moolenaar1e015462005-09-25 22:16:38 +0000632 if ind==b:PHP_default_indenting
Bram Moolenaare6ae6222013-05-21 21:01:10 +0200633 return b:PHP_default_indenting + addSpecial
Bram Moolenaar1e015462005-09-25 22:16:38 +0000634 elseif b:PHP_indentinghuge && ind==b:PHP_CurrentIndentLevel && cline !~# '^\s*\%(else\|\%(case\|default\).*:\|[})];\=\)' && last_line !~# '^\s*\%(\%(}\s*\)\=else\)' && getline(GetLastRealCodeLNum(lnum - 1))=~';'.endline
Bram Moolenaare6ae6222013-05-21 21:01:10 +0200635 return b:PHP_CurrentIndentLevel + addSpecial
Bram Moolenaar1e015462005-09-25 22:16:38 +0000636 endif
637 endif
638
639 let LastLineClosed = 0
640
Bram Moolenaarbcb98982014-05-01 14:08:19 +0200641 let terminated = s:terminated
Bram Moolenaar1e015462005-09-25 22:16:38 +0000642
643 let unstated = '\%(^\s*'.s:blockstart.'.*)\|\%(//.*\)\@<!\<e'.'lse\>\)'.endline
644
645 if ind != b:PHP_default_indenting && cline =~# '^\s*else\%(if\)\=\>'
646 let b:PHP_CurrentIndentLevel = b:PHP_default_indenting
647 return indent(FindTheIfOfAnElse(v:lnum, 1))
Bram Moolenaar8408a9a2010-07-30 22:41:22 +0200648 elseif cline =~# s:defaultORcase
649 return FindTheSwitchIndent(v:lnum) + &sw * b:PHP_vintage_case_default_indent
Bram Moolenaarc236c162008-07-13 17:41:49 +0000650 elseif cline =~ '^\s*)\=\s*{'
Bram Moolenaar1e015462005-09-25 22:16:38 +0000651 let previous_line = last_line
652 let last_line_num = lnum
653
654 while last_line_num > 1
655
Bram Moolenaarbcb98982014-05-01 14:08:19 +0200656 if previous_line =~ terminated || previous_line =~ '^\s*\%(' . s:blockstart . '\)\|'. s:functionDecl . endline
Bram Moolenaar1e015462005-09-25 22:16:38 +0000657
658 let ind = indent(last_line_num)
659
660 if b:PHP_BracesAtCodeLevel
661 let ind = ind + &sw
662 endif
663
Bram Moolenaarc9b4b052006-04-30 18:54:39 +0000664 return ind
Bram Moolenaar1e015462005-09-25 22:16:38 +0000665 endif
666
Bram Moolenaarbcb98982014-05-01 14:08:19 +0200667 let last_line_num = GetLastRealCodeLNum(last_line_num - 1)
Bram Moolenaar1e015462005-09-25 22:16:38 +0000668 let previous_line = getline(last_line_num)
669 endwhile
670
Bram Moolenaarc236c162008-07-13 17:41:49 +0000671 elseif last_line =~# unstated && cline !~ '^\s*);\='.endline
Bram Moolenaare6ae6222013-05-21 21:01:10 +0200672 let ind = ind + &sw " we indent one level further when the preceding line is not stated
673 return ind + addSpecial
Bram Moolenaar1e015462005-09-25 22:16:38 +0000674
Bram Moolenaare6ae6222013-05-21 21:01:10 +0200675 elseif (ind != b:PHP_default_indenting || last_line =~ '^[)\]]' ) && last_line =~ terminated " Added || last_line =~ '^)' on 2007-12-30 (array indenting problem broke other things)
Bram Moolenaar1e015462005-09-25 22:16:38 +0000676 let previous_line = last_line
677 let last_line_num = lnum
678 let LastLineClosed = 1
679
Bram Moolenaarbcb98982014-05-01 14:08:19 +0200680 let isSingleLineBlock = 0
Bram Moolenaar1e015462005-09-25 22:16:38 +0000681 while 1
Bram Moolenaarbcb98982014-05-01 14:08:19 +0200682 if ! isSingleLineBlock && previous_line =~ '^\s*}\|;\s*}'.endline " XXX
Bram Moolenaar1e015462005-09-25 22:16:38 +0000683
Bram Moolenaare6ae6222013-05-21 21:01:10 +0200684 call cursor(last_line_num, 1)
Bram Moolenaarbcb98982014-05-01 14:08:19 +0200685 if previous_line !~ '^}'
686 call search('}\|;\s*}'.endline, 'W')
687 end
Bram Moolenaare6ae6222013-05-21 21:01:10 +0200688 let oldLastLine = last_line_num
689 let last_line_num = searchpair('{', '', '}', 'bW', 'Skippmatch()')
690
Bram Moolenaarbcb98982014-05-01 14:08:19 +0200691 if getline(last_line_num) =~ '^\s*{'
Bram Moolenaar1e015462005-09-25 22:16:38 +0000692 let last_line_num = GetLastRealCodeLNum(last_line_num - 1)
Bram Moolenaarbcb98982014-05-01 14:08:19 +0200693 elseif oldLastLine == last_line_num
694 let isSingleLineBlock = 1
695 continue
Bram Moolenaar1e015462005-09-25 22:16:38 +0000696 endif
697
698 let previous_line = getline(last_line_num)
699
700 continue
701 else
Bram Moolenaarbcb98982014-05-01 14:08:19 +0200702 let isSingleLineBlock = 0
Bram Moolenaar1e015462005-09-25 22:16:38 +0000703
704 if getline(last_line_num) =~# '^\s*else\%(if\)\=\>'
705 let last_line_num = FindTheIfOfAnElse(last_line_num, 0)
706 continue
707 endif
708
709
710 let last_match = last_line_num
711
712 let one_ahead_indent = indent(last_line_num)
713 let last_line_num = GetLastRealCodeLNum(last_line_num - 1)
714 let two_ahead_indent = indent(last_line_num)
715 let after_previous_line = previous_line
716 let previous_line = getline(last_line_num)
717
718
Bram Moolenaar8408a9a2010-07-30 22:41:22 +0200719 if previous_line =~# s:defaultORcase.'\|{'.endline
Bram Moolenaar1e015462005-09-25 22:16:38 +0000720 break
721 endif
722
723 if after_previous_line=~# '^\s*'.s:blockstart.'.*)'.endline && previous_line =~# '[;}]'.endline
724 break
725 endif
726
Bram Moolenaarc9b4b052006-04-30 18:54:39 +0000727 if one_ahead_indent == two_ahead_indent || last_line_num < 1
Bram Moolenaarc236c162008-07-13 17:41:49 +0000728 if previous_line =~# '\%(;\|^\s*}\)'.endline || last_line_num < 1
Bram Moolenaar1e015462005-09-25 22:16:38 +0000729 break
730 endif
731 endif
732 endif
733 endwhile
734
735 if indent(last_match) != ind
736 let ind = indent(last_match)
737 let b:PHP_CurrentIndentLevel = b:PHP_default_indenting
738
Bram Moolenaare6ae6222013-05-21 21:01:10 +0200739 return ind + addSpecial
Bram Moolenaar1e015462005-09-25 22:16:38 +0000740 endif
741 endif
742
743 let plinnum = GetLastRealCodeLNum(lnum - 1)
Bram Moolenaar8408a9a2010-07-30 22:41:22 +0200744 let AntepenultimateLine = getline(plinnum)
Bram Moolenaar1e015462005-09-25 22:16:38 +0000745
746 let last_line = substitute(last_line,"\\(//\\|#\\)\\(\\(\\([^\"']*\\([\"']\\)[^\"']*\\5\\)\\+[^\"']*$\\)\\|\\([^\"']*$\\)\\)",'','')
747
748
749 if ind == b:PHP_default_indenting
750 if last_line =~ terminated
751 let LastLineClosed = 1
752 endif
753 endif
754
755 if !LastLineClosed
756
Bram Moolenaar5c736222010-01-06 20:54:52 +0100757
Bram Moolenaare6ae6222013-05-21 21:01:10 +0200758 if last_line =~# '[{(\[]'.endline || last_line =~? '\h\w*\s*(.*,$' && AntepenultimateLine !~ '[,(]'.endline
Bram Moolenaar1e015462005-09-25 22:16:38 +0000759
Bram Moolenaarbcb98982014-05-01 14:08:19 +0200760 let dontIndent = 0
761 if last_line =~ '\S\+\s*{'.endline && last_line !~ '^\s*\%(' . s:blockstart . '\)\|'. s:functionDecl . s:endline
762 let dontIndent = 1
763 endif
764
765 if !dontIndent && (!b:PHP_BracesAtCodeLevel || last_line !~# '^\s*{')
Bram Moolenaar1e015462005-09-25 22:16:38 +0000766 let ind = ind + &sw
767 endif
768
Bram Moolenaar8408a9a2010-07-30 22:41:22 +0200769 if b:PHP_BracesAtCodeLevel || b:PHP_vintage_case_default_indent == 1
Bram Moolenaar1e015462005-09-25 22:16:38 +0000770 let b:PHP_CurrentIndentLevel = ind
Bram Moolenaarc236c162008-07-13 17:41:49 +0000771
Bram Moolenaare6ae6222013-05-21 21:01:10 +0200772 return ind + addSpecial
Bram Moolenaar1e015462005-09-25 22:16:38 +0000773 endif
774
775 elseif last_line =~ '\S\+\s*),'.endline
776 call cursor(lnum, 1)
Bram Moolenaarbcb98982014-05-01 14:08:19 +0200777 call search('),'.endline, 'W') " line never begins with ) so no need for 'c' flag
Bram Moolenaar1e015462005-09-25 22:16:38 +0000778 let openedparent = searchpair('(', '', ')', 'bW', 'Skippmatch()')
779 if openedparent != lnum
780 let ind = indent(openedparent)
781 endif
Bram Moolenaare6ae6222013-05-21 21:01:10 +0200782
Bram Moolenaarc236c162008-07-13 17:41:49 +0000783 elseif last_line =~ '^\s*'.s:blockstart
Bram Moolenaar1e015462005-09-25 22:16:38 +0000784 let ind = ind + &sw
785
Bram Moolenaarc236c162008-07-13 17:41:49 +0000786
Bram Moolenaare6ae6222013-05-21 21:01:10 +0200787 elseif AntepenultimateLine =~ '\%(;\%(\s*\%(?>\|}\)\)\=\|<<<''\=\a\w*''\=$\|^\s*}\|{\)'.endline . '\|' . s:defaultORcase
Bram Moolenaarc236c162008-07-13 17:41:49 +0000788 let ind = ind + &sw
Bram Moolenaar1e015462005-09-25 22:16:38 +0000789 endif
790
Bram Moolenaar1e015462005-09-25 22:16:38 +0000791 endif
792
Bram Moolenaare6ae6222013-05-21 21:01:10 +0200793 if cline =~ '^\s*[)\]];\='
Bram Moolenaar1e015462005-09-25 22:16:38 +0000794 let ind = ind - &sw
Bram Moolenaar1e015462005-09-25 22:16:38 +0000795 endif
796
797 let b:PHP_CurrentIndentLevel = ind
Bram Moolenaare6ae6222013-05-21 21:01:10 +0200798 return ind + addSpecial
Bram Moolenaar9ff70112005-07-11 22:29:03 +0000799endfunction