blob: 1bffa7f19504cb7743c338dcd916da282be2a1be [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 Moolenaared32d942014-12-06 23:33:00 +01006" Last Change: 2014 November 26th
7" Version: 1.57
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
Bram Moolenaared32d942014-12-06 23:33:00 +010051let g:php_sync_method = 0
Bram Moolenaar9ff70112005-07-11 22:29:03 +000052
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 Moolenaared32d942014-12-06 23:33:00 +0100115setlocal indentkeys=0{,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
Bram Moolenaared32d942014-12-06 23:33:00 +0100131let s:PHP_validVariable = '[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*'
Bram Moolenaarbcb98982014-05-01 14:08:19 +0200132let s:notPhpHereDoc = '\%(break\|return\|continue\|exit\|die\|else\)'
133let 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\>\)'
Bram Moolenaared32d942014-12-06 23:33:00 +0100134let s:functionDecl = '\<function\>\%(\s\+'.s:PHP_validVariable.'\)\=\s*(.*'
Bram Moolenaar9ff70112005-07-11 22:29:03 +0000135let s:endline= '\s*\%(//.*\|#.*\|/\*.*\*/\s*\)\=$'
Bram Moolenaared32d942014-12-06 23:33:00 +0100136
137
138let s:terminated = '\%(\%(;\%(\s*\%(?>\|}\)\)\=\|<<<''\=\a\w*''\=$\|^\s*}\|^\s*'.s:PHP_validVariable.':\)'.s:endline.'\)\|^[^''"`]*[''"`]$'
Bram Moolenaar9ff70112005-07-11 22:29:03 +0000139let s:PHP_startindenttag = '<?\%(.*?>\)\@!\|<script[^>]*>\%(.*<\/script>\)\@!'
Bram Moolenaar071d4272004-06-13 20:20:40 +0000140
Bram Moolenaar9ff70112005-07-11 22:29:03 +0000141
Bram Moolenaarbcb98982014-05-01 14:08:19 +0200142
143let s:escapeDebugStops = 0
Bram Moolenaare6ae6222013-05-21 21:01:10 +0200144function! DebugPrintReturn(scriptLine)
145
Bram Moolenaared32d942014-12-06 23:33:00 +0100146 if ! s:escapeDebugStops
Bram Moolenaarbcb98982014-05-01 14:08:19 +0200147 echo "debug:" . a:scriptLine
148 let c = getchar()
149 if c == "\<Del>"
150 let s:escapeDebugStops = 1
151 end
152 endif
Bram Moolenaare6ae6222013-05-21 21:01:10 +0200153
154endfunction
155
Bram Moolenaar9ff70112005-07-11 22:29:03 +0000156function! GetLastRealCodeLNum(startline) " {{{
Bram Moolenaarc9b4b052006-04-30 18:54:39 +0000157
Bram Moolenaar1e015462005-09-25 22:16:38 +0000158 let lnum = a:startline
Bram Moolenaarc9b4b052006-04-30 18:54:39 +0000159
Bram Moolenaar05a7bb32006-01-19 22:09:32 +0000160 if b:GetLastRealCodeLNum_ADD && b:GetLastRealCodeLNum_ADD == lnum + 1
161 let lnum = b:GetLastRealCodeLNum_ADD
162 endif
Bram Moolenaarc9b4b052006-04-30 18:54:39 +0000163
Bram Moolenaar1e015462005-09-25 22:16:38 +0000164 while lnum > 1
165 let lnum = prevnonblank(lnum)
166 let lastline = getline(lnum)
167
168 if b:InPHPcode_and_script && lastline =~ '?>\s*$'
169 let lnum = lnum - 1
170 elseif lastline =~ '^\s*?>.*<?\%(php\)\=\s*$'
171 let lnum = lnum - 1
172 elseif lastline =~ '^\s*\%(//\|#\|/\*.*\*/\s*$\)'
173 let lnum = lnum - 1
174 elseif lastline =~ '\*/\s*$'
175 call cursor(lnum, 1)
176 if lastline !~ '^\*/'
177 call search('\*/', 'W')
178 endif
Bram Moolenaara5792f52005-11-23 21:25:05 +0000179 let lnum = searchpair('/\*', '', '\*/', s:searchpairflags, 'Skippmatch2()')
Bram Moolenaar1e015462005-09-25 22:16:38 +0000180
181 let lastline = getline(lnum)
182 if lastline =~ '^\s*/\*'
183 let lnum = lnum - 1
184 else
185 break
186 endif
187
188
189 elseif lastline =~? '\%(//\s*\|?>.*\)\@<!<?\%(php\)\=\s*$\|^\s*<script\>'
190
191 while lastline !~ '\(<?.*\)\@<!?>' && lnum > 1
192 let lnum = lnum - 1
Bram Moolenaar9ff70112005-07-11 22:29:03 +0000193 let lastline = getline(lnum)
Bram Moolenaar1e015462005-09-25 22:16:38 +0000194 endwhile
195 if lastline =~ '^\s*?>'
196 let lnum = lnum - 1
197 else
198 break
199 endif
Bram Moolenaar9ff70112005-07-11 22:29:03 +0000200
201
Bram Moolenaar8408a9a2010-07-30 22:41:22 +0200202 elseif lastline =~? '^\a\w*;\=$' && lastline !~? s:notPhpHereDoc
203 let tofind=substitute( lastline, '\(\a\w*\);\=', '<<<''\\=\1''\\=$', '')
Bram Moolenaar1e015462005-09-25 22:16:38 +0000204 while getline(lnum) !~? tofind && lnum > 1
205 let lnum = lnum - 1
206 endwhile
Bram Moolenaarbcb98982014-05-01 14:08:19 +0200207 elseif lastline =~ '^[^''"`]*[''"`][;,]'.s:endline
208 let tofind=substitute( lastline, '^.*\([''"`]\)[;,].*$', '^[^\1]\\+[\1]$', '')
209 while getline(lnum) !~? tofind && lnum > 1
210 let lnum = lnum - 1
211 endwhile
Bram Moolenaar1e015462005-09-25 22:16:38 +0000212 else
Bram Moolenaarc9b4b052006-04-30 18:54:39 +0000213 break
Bram Moolenaar9ff70112005-07-11 22:29:03 +0000214 endif
Bram Moolenaar1e015462005-09-25 22:16:38 +0000215 endwhile
216
Bram Moolenaar8408a9a2010-07-30 22:41:22 +0200217 if lnum==1 && getline(lnum) !~ '<?'
Bram Moolenaar1e015462005-09-25 22:16:38 +0000218 let lnum=0
219 endif
220
Bram Moolenaared32d942014-12-06 23:33:00 +0100221 if b:InPHPcode_and_script && 1 > b:InPHPcode
Bram Moolenaar1e015462005-09-25 22:16:38 +0000222 let b:InPHPcode_and_script = 0
223 endif
Bram Moolenaard5ab34b2007-05-05 17:15:44 +0000224
Bram Moolenaar1e015462005-09-25 22:16:38 +0000225 return lnum
226endfunction " }}}
Bram Moolenaar9ff70112005-07-11 22:29:03 +0000227
Bram Moolenaara5792f52005-11-23 21:25:05 +0000228function! Skippmatch2()
229
230 let line = getline(".")
231
Bram Moolenaare6ae6222013-05-21 21:01:10 +0200232 if line =~ "\\([\"']\\).*/\\*.*\\1" || line =~ '\%(//\|#\).*/\*'
Bram Moolenaarbcb98982014-05-01 14:08:19 +0200233 return 1
Bram Moolenaare6ae6222013-05-21 21:01:10 +0200234 else
Bram Moolenaarbcb98982014-05-01 14:08:19 +0200235 return 0
Bram Moolenaare6ae6222013-05-21 21:01:10 +0200236 endif
Bram Moolenaara5792f52005-11-23 21:25:05 +0000237endfun
238
Bram Moolenaar8408a9a2010-07-30 22:41:22 +0200239function! Skippmatch() " {{{
Bram Moolenaar1e015462005-09-25 22:16:38 +0000240 let synname = synIDattr(synID(line("."), col("."), 0), "name")
Bram Moolenaared32d942014-12-06 23:33:00 +0100241 if synname == "Delimiter" || synname == "phpRegionDelimiter" || synname =~# "^phpParent" || synname == "phpArrayParens" || synname =~# '^php\%(Block\|Brace\)' || synname == "javaScriptBraces" || synname =~# '^php\%(Doc\)\?Comment' && b:UserIsTypingComment
Bram Moolenaar1e015462005-09-25 22:16:38 +0000242 return 0
243 else
244 return 1
245 endif
246endfun " }}}
Bram Moolenaar9ff70112005-07-11 22:29:03 +0000247
Bram Moolenaarbcb98982014-05-01 14:08:19 +0200248function! FindOpenBracket(lnum, blockStarter) " {{{
Bram Moolenaar1e015462005-09-25 22:16:38 +0000249 call cursor(a:lnum, 1)
Bram Moolenaarbcb98982014-05-01 14:08:19 +0200250 let line = searchpair('{', '', '}', 'bW', 'Skippmatch()')
251
252 if a:blockStarter == 1
Bram Moolenaared32d942014-12-06 23:33:00 +0100253 while line > 1
Bram Moolenaarbcb98982014-05-01 14:08:19 +0200254 let linec = getline(line)
255
256 if linec =~ s:terminated || linec =~ '^\s*\%(' . s:blockstart . '\)\|'. s:functionDecl . s:endline
257 break
258 endif
259
260 let line = GetLastRealCodeLNum(line - 1)
261 endwhile
262 endif
263
264 return line
Bram Moolenaar1e015462005-09-25 22:16:38 +0000265endfun " }}}
Bram Moolenaar9ff70112005-07-11 22:29:03 +0000266
267function! FindTheIfOfAnElse (lnum, StopAfterFirstPrevElse) " {{{
Bram Moolenaar1e015462005-09-25 22:16:38 +0000268
269 if getline(a:lnum) =~# '^\s*}\s*else\%(if\)\=\>'
270 let beforeelse = a:lnum
271 else
272 let beforeelse = GetLastRealCodeLNum(a:lnum - 1)
273 endif
274
275 if !s:level
276 let s:iftoskip = 0
277 endif
278
279 if getline(beforeelse) =~# '^\s*\%(}\s*\)\=else\%(\s*if\)\@!\>'
280 let s:iftoskip = s:iftoskip + 1
281 endif
282
283 if getline(beforeelse) =~ '^\s*}'
Bram Moolenaarbcb98982014-05-01 14:08:19 +0200284 let beforeelse = FindOpenBracket(beforeelse, 0)
Bram Moolenaar1e015462005-09-25 22:16:38 +0000285
286 if getline(beforeelse) =~ '^\s*{'
287 let beforeelse = GetLastRealCodeLNum(beforeelse - 1)
Bram Moolenaar9ff70112005-07-11 22:29:03 +0000288 endif
Bram Moolenaar1e015462005-09-25 22:16:38 +0000289 endif
Bram Moolenaar9ff70112005-07-11 22:29:03 +0000290
291
Bram Moolenaar1e015462005-09-25 22:16:38 +0000292 if !s:iftoskip && a:StopAfterFirstPrevElse && getline(beforeelse) =~# '^\s*\%([}]\s*\)\=else\%(if\)\=\>'
Bram Moolenaar9ff70112005-07-11 22:29:03 +0000293 return beforeelse
Bram Moolenaar1e015462005-09-25 22:16:38 +0000294 endif
Bram Moolenaar9ff70112005-07-11 22:29:03 +0000295
Bram Moolenaar1e015462005-09-25 22:16:38 +0000296 if getline(beforeelse) !~# '^\s*if\>' && beforeelse>1 || s:iftoskip && beforeelse>1
297
Bram Moolenaar8408a9a2010-07-30 22:41:22 +0200298 if s:iftoskip && getline(beforeelse) =~# '^\s*if\>'
Bram Moolenaar1e015462005-09-25 22:16:38 +0000299 let s:iftoskip = s:iftoskip - 1
300 endif
301
302 let s:level = s:level + 1
303 let beforeelse = FindTheIfOfAnElse(beforeelse, a:StopAfterFirstPrevElse)
304 endif
305
306 return beforeelse
307
308endfunction " }}}
Bram Moolenaar9ff70112005-07-11 22:29:03 +0000309
Bram Moolenaar8408a9a2010-07-30 22:41:22 +0200310let s:defaultORcase = '^\s*\%(default\|case\).*:'
311
312function! FindTheSwitchIndent (lnum) " {{{
313
Bram Moolenaar8408a9a2010-07-30 22:41:22 +0200314 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*[''"`]'
Bram Moolenaared32d942014-12-06 23:33:00 +0100356 return "SpecStringEntrails"
Bram Moolenaarbcb98982014-05-01 14:08:19 +0200357 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 Moolenaared32d942014-12-06 23:33:00 +0100375 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 Moolenaared32d942014-12-06 23:33:00 +0100421 let real_PHP_lastindented = v:lnum
Bram Moolenaar1e015462005-09-25 22:16:38 +0000422 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
Bram Moolenaared32d942014-12-06 23:33:00 +0100433 else
434 let real_PHP_lastindented = v:lnum
Bram Moolenaar1e015462005-09-25 22:16:38 +0000435 endif
Bram Moolenaar9ff70112005-07-11 22:29:03 +0000436
Bram Moolenaared32d942014-12-06 23:33:00 +0100437 let b:PHP_lastindented = v:lnum
438
Bram Moolenaar1e015462005-09-25 22:16:38 +0000439
440 if !b:InPHPcode_checked " {{{ One time check
441 let b:InPHPcode_checked = 1
442
Bram Moolenaar05a7bb32006-01-19 22:09:32 +0000443 let synname = ""
444 if cline !~ '<?.*?>'
445 let synname = IslinePHP (prevnonblank(v:lnum), "")
446 endif
Bram Moolenaar1e015462005-09-25 22:16:38 +0000447
448 if synname!=""
Bram Moolenaared32d942014-12-06 23:33:00 +0100449 if synname == "SpecStringEntrails"
450 let b:InPHPcode = -1 " thumb down
451 let b:UserIsTypingComment = 0
452 let b:InPHPcode_tofind = ""
453 elseif synname != "phpHereDoc" && synname != "phpHereDocDelimiter"
Bram Moolenaar1e015462005-09-25 22:16:38 +0000454 let b:InPHPcode = 1
Bram Moolenaar9ff70112005-07-11 22:29:03 +0000455 let b:InPHPcode_tofind = ""
456
Bram Moolenaared32d942014-12-06 23:33:00 +0100457 if synname =~# '^php\%(Doc\)\?Comment'
Bram Moolenaar1e015462005-09-25 22:16:38 +0000458 let b:UserIsTypingComment = 1
Bram Moolenaar9ff70112005-07-11 22:29:03 +0000459 else
Bram Moolenaar1e015462005-09-25 22:16:38 +0000460 let b:UserIsTypingComment = 0
Bram Moolenaar9ff70112005-07-11 22:29:03 +0000461 endif
Bram Moolenaar9ff70112005-07-11 22:29:03 +0000462
Bram Moolenaar1e015462005-09-25 22:16:38 +0000463 if synname =~? '^javaScript'
464 let b:InPHPcode_and_script = 1
Bram Moolenaar9ff70112005-07-11 22:29:03 +0000465 endif
Bram Moolenaar9ff70112005-07-11 22:29:03 +0000466
Bram Moolenaar1e015462005-09-25 22:16:38 +0000467 else
468 let b:InPHPcode = 0
469 let b:UserIsTypingComment = 0
Bram Moolenaar9ff70112005-07-11 22:29:03 +0000470
Bram Moolenaar1e015462005-09-25 22:16:38 +0000471 let lnum = v:lnum - 1
Bram Moolenaarc236c162008-07-13 17:41:49 +0000472 while getline(lnum) !~? '<<<''\=\a\w*''\=$' && lnum > 1
Bram Moolenaar1e015462005-09-25 22:16:38 +0000473 let lnum = lnum - 1
Bram Moolenaar9ff70112005-07-11 22:29:03 +0000474 endwhile
475
Bram Moolenaar8408a9a2010-07-30 22:41:22 +0200476 let b:InPHPcode_tofind = substitute( getline(lnum), '^.*<<<''\=\(\a\w*\)''\=$', '^\\s*\1;\\=$', '')
Bram Moolenaar1e015462005-09-25 22:16:38 +0000477 endif
478 else
479 let b:InPHPcode = 0
480 let b:UserIsTypingComment = 0
Bram Moolenaare6ae6222013-05-21 21:01:10 +0200481 let b:InPHPcode_tofind = s:PHP_startindenttag
Bram Moolenaar9ff70112005-07-11 22:29:03 +0000482 endif
Bram Moolenaar1e015462005-09-25 22:16:38 +0000483 endif "!b:InPHPcode_checked }}}
Bram Moolenaar9ff70112005-07-11 22:29:03 +0000484
485
Bram Moolenaar1e015462005-09-25 22:16:38 +0000486 " Test if we are indenting PHP code {{{
487 let lnum = prevnonblank(v:lnum - 1)
488 let last_line = getline(lnum)
Bram Moolenaarbcb98982014-05-01 14:08:19 +0200489 let endline= s:endline
Bram Moolenaar1e015462005-09-25 22:16:38 +0000490
491 if b:InPHPcode_tofind!=""
492 if cline =~? b:InPHPcode_tofind
Bram Moolenaar1e015462005-09-25 22:16:38 +0000493 let b:InPHPcode_tofind = ""
494 let b:UserIsTypingComment = 0
Bram Moolenaared32d942014-12-06 23:33:00 +0100495
496 if b:InPHPcode == -1
497 let b:InPHPcode = 1
498 return -1
499 end
500
501 let b:InPHPcode = 1
502
Bram Moolenaar1e015462005-09-25 22:16:38 +0000503 if cline =~ '\*/'
504 call cursor(v:lnum, 1)
505 if cline !~ '^\*/'
506 call search('\*/', 'W')
Bram Moolenaar9ff70112005-07-11 22:29:03 +0000507 endif
Bram Moolenaara5792f52005-11-23 21:25:05 +0000508 let lnum = searchpair('/\*', '', '\*/', s:searchpairflags, 'Skippmatch2()')
Bram Moolenaar9ff70112005-07-11 22:29:03 +0000509
Bram Moolenaar1e015462005-09-25 22:16:38 +0000510 let b:PHP_CurrentIndentLevel = b:PHP_default_indenting
Bram Moolenaar9ff70112005-07-11 22:29:03 +0000511
Bram Moolenaar1e015462005-09-25 22:16:38 +0000512 let b:PHP_LastIndentedWasComment = 0
Bram Moolenaar9ff70112005-07-11 22:29:03 +0000513
Bram Moolenaar1e015462005-09-25 22:16:38 +0000514 if cline =~ '^\s*\*/'
515 return indent(lnum) + 1
516 else
517 return indent(lnum)
Bram Moolenaar9ff70112005-07-11 22:29:03 +0000518 endif
519
Bram Moolenaar1e015462005-09-25 22:16:38 +0000520 elseif cline =~? '<script\>'
521 let b:InPHPcode_and_script = 1
Bram Moolenaar05a7bb32006-01-19 22:09:32 +0000522 let b:GetLastRealCodeLNum_ADD = v:lnum
Bram Moolenaar1e015462005-09-25 22:16:38 +0000523 endif
Bram Moolenaar9ff70112005-07-11 22:29:03 +0000524 endif
Bram Moolenaar1e015462005-09-25 22:16:38 +0000525 endif
Bram Moolenaar9ff70112005-07-11 22:29:03 +0000526
Bram Moolenaared32d942014-12-06 23:33:00 +0100527 if 1 == b:InPHPcode
Bram Moolenaar1e015462005-09-25 22:16:38 +0000528
Bram Moolenaard5ab34b2007-05-05 17:15:44 +0000529 if !b:InPHPcode_and_script && last_line =~ '\%(<?.*\)\@<!?>\%(.*<?\)\@!' && IslinePHP(lnum, '?>')=~"Delimiter"
Bram Moolenaar1e015462005-09-25 22:16:38 +0000530 if cline !~? s:PHP_startindenttag
531 let b:InPHPcode = 0
532 let b:InPHPcode_tofind = s:PHP_startindenttag
533 elseif cline =~? '<script\>'
534 let b:InPHPcode_and_script = 1
535 endif
536
Bram Moolenaared32d942014-12-06 23:33:00 +0100537 elseif last_line =~ '^[^''"`]\+[''"`]$'
538 let b:InPHPcode = -1
Bram Moolenaarbcb98982014-05-01 14:08:19 +0200539 let b:InPHPcode_tofind = substitute( last_line, '^.*\([''"`]\).*$', '^[^\1]*\1[;,]$', '')
Bram Moolenaar8408a9a2010-07-30 22:41:22 +0200540 elseif last_line =~? '<<<''\=\a\w*''\=$'
Bram Moolenaar1e015462005-09-25 22:16:38 +0000541 let b:InPHPcode = 0
Bram Moolenaar8408a9a2010-07-30 22:41:22 +0200542 let b:InPHPcode_tofind = substitute( last_line, '^.*<<<''\=\(\a\w*\)''\=$', '^\\s*\1;\\=$', '')
Bram Moolenaar1e015462005-09-25 22:16:38 +0000543
544 elseif !UserIsEditing && cline =~ '^\s*/\*\%(.*\*/\)\@!' && getline(v:lnum + 1) !~ '^\s*\*'
545 let b:InPHPcode = 0
546 let b:InPHPcode_tofind = '\*/'
547
548 elseif cline =~? '^\s*</script>'
549 let b:InPHPcode = 0
550 let b:InPHPcode_tofind = s:PHP_startindenttag
Bram Moolenaar9ff70112005-07-11 22:29:03 +0000551 endif
Bram Moolenaar1e015462005-09-25 22:16:38 +0000552 endif " }}}
Bram Moolenaar9ff70112005-07-11 22:29:03 +0000553
Bram Moolenaarc9b4b052006-04-30 18:54:39 +0000554
Bram Moolenaared32d942014-12-06 23:33:00 +0100555 if 1 > b:InPHPcode && !b:InPHPcode_and_script
Bram Moolenaar1e015462005-09-25 22:16:38 +0000556 return -1
557 endif
558
Bram Moolenaar1e015462005-09-25 22:16:38 +0000559 " Indent successive // or # comment the same way the first is {{{
Bram Moolenaare6ae6222013-05-21 21:01:10 +0200560 let addSpecial = 0
Bram Moolenaar1e015462005-09-25 22:16:38 +0000561 if cline =~ '^\s*\%(//\|#\|/\*.*\*/\s*$\)'
Bram Moolenaare6ae6222013-05-21 21:01:10 +0200562 let addSpecial = b:PHP_outdentSLComments
Bram Moolenaar1e015462005-09-25 22:16:38 +0000563 if b:PHP_LastIndentedWasComment == 1
564 return indent(real_PHP_lastindented)
565 endif
566 let b:PHP_LastIndentedWasComment = 1
567 else
568 let b:PHP_LastIndentedWasComment = 0
569 endif " }}}
570
571 " Indent multiline /* comments correctly {{{
572
573 if b:PHP_InsideMultilineComment || b:UserIsTypingComment
574 if cline =~ '^\s*\*\%(\/\)\@!'
575 if last_line =~ '^\s*/\*'
576 return indent(lnum) + 1
577 else
578 return indent(lnum)
579 endif
580 else
581 let b:PHP_InsideMultilineComment = 0
582 endif
583 endif
584
Bram Moolenaared32d942014-12-06 23:33:00 +0100585 if !b:PHP_InsideMultilineComment && cline =~ '^\s*/\*\%(.*\*/\)\@!'
Bram Moolenaar05a7bb32006-01-19 22:09:32 +0000586 if getline(v:lnum + 1) !~ '^\s*\*'
587 return -1
588 endif
Bram Moolenaar1e015462005-09-25 22:16:38 +0000589 let b:PHP_InsideMultilineComment = 1
Bram Moolenaar1e015462005-09-25 22:16:38 +0000590 endif " }}}
591
592
593 " Things always indented at col 1 (PHP delimiter: <?, ?>, Heredoc end) {{{
Bram Moolenaar8408a9a2010-07-30 22:41:22 +0200594 if cline =~# '^\s*<?' && cline !~ '?>' && b:PHP_outdentphpescape
Bram Moolenaar1e015462005-09-25 22:16:38 +0000595 return 0
596 endif
597
Bram Moolenaar8408a9a2010-07-30 22:41:22 +0200598 if cline =~ '^\s*?>' && cline !~# '<?' && b:PHP_outdentphpescape
Bram Moolenaar1e015462005-09-25 22:16:38 +0000599 return 0
600 endif
601
Bram Moolenaarbcb98982014-05-01 14:08:19 +0200602 if cline =~? '^\s*\a\w*;$\|^\a\w*$\|^\s*[''"`][;,]' && cline !~? s:notPhpHereDoc
Bram Moolenaar1e015462005-09-25 22:16:38 +0000603 return 0
604 endif " }}}
605
606 let s:level = 0
607
608 let lnum = GetLastRealCodeLNum(v:lnum - 1)
Bram Moolenaar05a7bb32006-01-19 22:09:32 +0000609
Bram Moolenaar1e015462005-09-25 22:16:38 +0000610 let last_line = getline(lnum)
611 let ind = indent(lnum)
Bram Moolenaar1e015462005-09-25 22:16:38 +0000612
613 if ind==0 && b:PHP_default_indenting
614 let ind = b:PHP_default_indenting
615 endif
616
617 if lnum == 0
Bram Moolenaare6ae6222013-05-21 21:01:10 +0200618 return b:PHP_default_indenting + addSpecial
Bram Moolenaar1e015462005-09-25 22:16:38 +0000619 endif
620
621
622 if cline =~ '^\s*}\%(}}\)\@!'
Bram Moolenaarbcb98982014-05-01 14:08:19 +0200623 let ind = indent(FindOpenBracket(v:lnum, 1))
Bram Moolenaar1e015462005-09-25 22:16:38 +0000624 let b:PHP_CurrentIndentLevel = b:PHP_default_indenting
Bram Moolenaar9ff70112005-07-11 22:29:03 +0000625 return ind
Bram Moolenaar1e015462005-09-25 22:16:38 +0000626 endif
627
628 if cline =~ '^\s*\*/'
629 call cursor(v:lnum, 1)
630 if cline !~ '^\*/'
631 call search('\*/', 'W')
632 endif
Bram Moolenaara5792f52005-11-23 21:25:05 +0000633 let lnum = searchpair('/\*', '', '\*/', s:searchpairflags, 'Skippmatch2()')
Bram Moolenaar1e015462005-09-25 22:16:38 +0000634
635 let b:PHP_CurrentIndentLevel = b:PHP_default_indenting
636
637 if cline =~ '^\s*\*/'
638 return indent(lnum) + 1
639 else
640 return indent(lnum)
641 endif
642 endif
643
Bram Moolenaar1e015462005-09-25 22:16:38 +0000644
Bram Moolenaare6ae6222013-05-21 21:01:10 +0200645 if last_line =~ '[;}]'.endline && last_line !~ '^[)\]]' && last_line !~# s:defaultORcase
Bram Moolenaar1e015462005-09-25 22:16:38 +0000646 if ind==b:PHP_default_indenting
Bram Moolenaare6ae6222013-05-21 21:01:10 +0200647 return b:PHP_default_indenting + addSpecial
Bram Moolenaar1e015462005-09-25 22:16:38 +0000648 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 +0200649 return b:PHP_CurrentIndentLevel + addSpecial
Bram Moolenaar1e015462005-09-25 22:16:38 +0000650 endif
651 endif
652
653 let LastLineClosed = 0
654
Bram Moolenaarbcb98982014-05-01 14:08:19 +0200655 let terminated = s:terminated
Bram Moolenaar1e015462005-09-25 22:16:38 +0000656
657 let unstated = '\%(^\s*'.s:blockstart.'.*)\|\%(//.*\)\@<!\<e'.'lse\>\)'.endline
658
659 if ind != b:PHP_default_indenting && cline =~# '^\s*else\%(if\)\=\>'
660 let b:PHP_CurrentIndentLevel = b:PHP_default_indenting
661 return indent(FindTheIfOfAnElse(v:lnum, 1))
Bram Moolenaar8408a9a2010-07-30 22:41:22 +0200662 elseif cline =~# s:defaultORcase
663 return FindTheSwitchIndent(v:lnum) + &sw * b:PHP_vintage_case_default_indent
Bram Moolenaarc236c162008-07-13 17:41:49 +0000664 elseif cline =~ '^\s*)\=\s*{'
Bram Moolenaar1e015462005-09-25 22:16:38 +0000665 let previous_line = last_line
666 let last_line_num = lnum
667
668 while last_line_num > 1
669
Bram Moolenaarbcb98982014-05-01 14:08:19 +0200670 if previous_line =~ terminated || previous_line =~ '^\s*\%(' . s:blockstart . '\)\|'. s:functionDecl . endline
Bram Moolenaar1e015462005-09-25 22:16:38 +0000671
672 let ind = indent(last_line_num)
673
674 if b:PHP_BracesAtCodeLevel
675 let ind = ind + &sw
676 endif
677
Bram Moolenaarc9b4b052006-04-30 18:54:39 +0000678 return ind
Bram Moolenaar1e015462005-09-25 22:16:38 +0000679 endif
680
Bram Moolenaarbcb98982014-05-01 14:08:19 +0200681 let last_line_num = GetLastRealCodeLNum(last_line_num - 1)
Bram Moolenaar1e015462005-09-25 22:16:38 +0000682 let previous_line = getline(last_line_num)
683 endwhile
684
Bram Moolenaarc236c162008-07-13 17:41:49 +0000685 elseif last_line =~# unstated && cline !~ '^\s*);\='.endline
Bram Moolenaared32d942014-12-06 23:33:00 +0100686 let ind = ind + &sw
Bram Moolenaare6ae6222013-05-21 21:01:10 +0200687 return ind + addSpecial
Bram Moolenaar1e015462005-09-25 22:16:38 +0000688
Bram Moolenaared32d942014-12-06 23:33:00 +0100689 elseif (ind != b:PHP_default_indenting || last_line =~ '^[)\]]' ) && last_line =~ terminated
Bram Moolenaar1e015462005-09-25 22:16:38 +0000690 let previous_line = last_line
691 let last_line_num = lnum
692 let LastLineClosed = 1
693
Bram Moolenaarbcb98982014-05-01 14:08:19 +0200694 let isSingleLineBlock = 0
Bram Moolenaar1e015462005-09-25 22:16:38 +0000695 while 1
Bram Moolenaared32d942014-12-06 23:33:00 +0100696 if ! isSingleLineBlock && previous_line =~ '^\s*}\|;\s*}'.endline
Bram Moolenaar1e015462005-09-25 22:16:38 +0000697
Bram Moolenaare6ae6222013-05-21 21:01:10 +0200698 call cursor(last_line_num, 1)
Bram Moolenaarbcb98982014-05-01 14:08:19 +0200699 if previous_line !~ '^}'
700 call search('}\|;\s*}'.endline, 'W')
701 end
Bram Moolenaare6ae6222013-05-21 21:01:10 +0200702 let oldLastLine = last_line_num
703 let last_line_num = searchpair('{', '', '}', 'bW', 'Skippmatch()')
704
Bram Moolenaarbcb98982014-05-01 14:08:19 +0200705 if getline(last_line_num) =~ '^\s*{'
Bram Moolenaar1e015462005-09-25 22:16:38 +0000706 let last_line_num = GetLastRealCodeLNum(last_line_num - 1)
Bram Moolenaarbcb98982014-05-01 14:08:19 +0200707 elseif oldLastLine == last_line_num
708 let isSingleLineBlock = 1
709 continue
Bram Moolenaar1e015462005-09-25 22:16:38 +0000710 endif
711
712 let previous_line = getline(last_line_num)
713
714 continue
715 else
Bram Moolenaarbcb98982014-05-01 14:08:19 +0200716 let isSingleLineBlock = 0
Bram Moolenaar1e015462005-09-25 22:16:38 +0000717
718 if getline(last_line_num) =~# '^\s*else\%(if\)\=\>'
719 let last_line_num = FindTheIfOfAnElse(last_line_num, 0)
720 continue
721 endif
722
723
724 let last_match = last_line_num
725
726 let one_ahead_indent = indent(last_line_num)
727 let last_line_num = GetLastRealCodeLNum(last_line_num - 1)
728 let two_ahead_indent = indent(last_line_num)
729 let after_previous_line = previous_line
730 let previous_line = getline(last_line_num)
731
732
Bram Moolenaar8408a9a2010-07-30 22:41:22 +0200733 if previous_line =~# s:defaultORcase.'\|{'.endline
Bram Moolenaar1e015462005-09-25 22:16:38 +0000734 break
735 endif
736
737 if after_previous_line=~# '^\s*'.s:blockstart.'.*)'.endline && previous_line =~# '[;}]'.endline
738 break
739 endif
740
Bram Moolenaarc9b4b052006-04-30 18:54:39 +0000741 if one_ahead_indent == two_ahead_indent || last_line_num < 1
Bram Moolenaarc236c162008-07-13 17:41:49 +0000742 if previous_line =~# '\%(;\|^\s*}\)'.endline || last_line_num < 1
Bram Moolenaar1e015462005-09-25 22:16:38 +0000743 break
744 endif
745 endif
746 endif
747 endwhile
748
749 if indent(last_match) != ind
750 let ind = indent(last_match)
751 let b:PHP_CurrentIndentLevel = b:PHP_default_indenting
752
Bram Moolenaare6ae6222013-05-21 21:01:10 +0200753 return ind + addSpecial
Bram Moolenaar1e015462005-09-25 22:16:38 +0000754 endif
755 endif
756
Bram Moolenaared32d942014-12-06 23:33:00 +0100757 if (last_line !~ '^\s*}\%(}}\)\@!')
758 let plinnum = GetLastRealCodeLNum(lnum - 1)
759 else
760 let plinnum = GetLastRealCodeLNum(FindOpenBracket(lnum, 1) - 1)
761 endif
762
Bram Moolenaar8408a9a2010-07-30 22:41:22 +0200763 let AntepenultimateLine = getline(plinnum)
Bram Moolenaar1e015462005-09-25 22:16:38 +0000764
765 let last_line = substitute(last_line,"\\(//\\|#\\)\\(\\(\\([^\"']*\\([\"']\\)[^\"']*\\5\\)\\+[^\"']*$\\)\\|\\([^\"']*$\\)\\)",'','')
766
767
768 if ind == b:PHP_default_indenting
Bram Moolenaared32d942014-12-06 23:33:00 +0100769 if last_line =~ terminated && last_line !~# s:defaultORcase
Bram Moolenaar1e015462005-09-25 22:16:38 +0000770 let LastLineClosed = 1
771 endif
772 endif
773
774 if !LastLineClosed
775
Bram Moolenaar5c736222010-01-06 20:54:52 +0100776
Bram Moolenaared32d942014-12-06 23:33:00 +0100777 if last_line =~# '[{(\[]'.endline || last_line =~? '\h\w*\s*(.*,$' && AntepenultimateLine !~ '[,(\[]'.endline
Bram Moolenaar1e015462005-09-25 22:16:38 +0000778
Bram Moolenaarbcb98982014-05-01 14:08:19 +0200779 let dontIndent = 0
Bram Moolenaared32d942014-12-06 23:33:00 +0100780 if last_line =~ '\S\+\s*{'.endline && last_line !~ '^\s*)\s*{'.endline && last_line !~ '^\s*\%(' . s:blockstart . '\)\|'. s:functionDecl . s:endline
Bram Moolenaarbcb98982014-05-01 14:08:19 +0200781 let dontIndent = 1
782 endif
783
784 if !dontIndent && (!b:PHP_BracesAtCodeLevel || last_line !~# '^\s*{')
Bram Moolenaar1e015462005-09-25 22:16:38 +0000785 let ind = ind + &sw
786 endif
787
Bram Moolenaar8408a9a2010-07-30 22:41:22 +0200788 if b:PHP_BracesAtCodeLevel || b:PHP_vintage_case_default_indent == 1
Bram Moolenaar1e015462005-09-25 22:16:38 +0000789 let b:PHP_CurrentIndentLevel = ind
Bram Moolenaarc236c162008-07-13 17:41:49 +0000790
Bram Moolenaare6ae6222013-05-21 21:01:10 +0200791 return ind + addSpecial
Bram Moolenaar1e015462005-09-25 22:16:38 +0000792 endif
793
794 elseif last_line =~ '\S\+\s*),'.endline
795 call cursor(lnum, 1)
Bram Moolenaared32d942014-12-06 23:33:00 +0100796 call search('),'.endline, 'W')
Bram Moolenaar1e015462005-09-25 22:16:38 +0000797 let openedparent = searchpair('(', '', ')', 'bW', 'Skippmatch()')
798 if openedparent != lnum
799 let ind = indent(openedparent)
800 endif
Bram Moolenaare6ae6222013-05-21 21:01:10 +0200801
Bram Moolenaarc236c162008-07-13 17:41:49 +0000802 elseif last_line =~ '^\s*'.s:blockstart
Bram Moolenaar1e015462005-09-25 22:16:38 +0000803 let ind = ind + &sw
804
Bram Moolenaarc236c162008-07-13 17:41:49 +0000805
Bram Moolenaared32d942014-12-06 23:33:00 +0100806 elseif AntepenultimateLine =~ '{'.endline || AntepenultimateLine =~ terminated || AntepenultimateLine =~# s:defaultORcase
Bram Moolenaarc236c162008-07-13 17:41:49 +0000807 let ind = ind + &sw
Bram Moolenaar1e015462005-09-25 22:16:38 +0000808 endif
809
Bram Moolenaar1e015462005-09-25 22:16:38 +0000810 endif
811
Bram Moolenaare6ae6222013-05-21 21:01:10 +0200812 if cline =~ '^\s*[)\]];\='
Bram Moolenaar1e015462005-09-25 22:16:38 +0000813 let ind = ind - &sw
Bram Moolenaar1e015462005-09-25 22:16:38 +0000814 endif
815
816 let b:PHP_CurrentIndentLevel = ind
Bram Moolenaare6ae6222013-05-21 21:01:10 +0200817 return ind + addSpecial
Bram Moolenaar9ff70112005-07-11 22:29:03 +0000818endfunction