blob: 07ecd8f141da960f398c0ae8cc9b302c39e9c402 [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 Moolenaarcbebd482016-02-07 23:02:56 +01006" Last Change: 2015 September 8th
7" Version: 1.60
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
Bram Moolenaarcbebd482016-02-07 23:02:56 +010053if exists('*shiftwidth')
54 function! s:sw()
55 return shiftwidth()
56 endfunction
57else
58 function! s:sw()
59 return &shiftwidth
60 endfunction
61endif
Bram Moolenaar9ff70112005-07-11 22:29:03 +000062
Bram Moolenaare6ae6222013-05-21 21:01:10 +020063
Bram Moolenaar9ff70112005-07-11 22:29:03 +000064if exists("PHP_default_indenting")
Bram Moolenaarcbebd482016-02-07 23:02:56 +010065 let b:PHP_default_indenting = PHP_default_indenting * s:sw()
Bram Moolenaar9ff70112005-07-11 22:29:03 +000066else
Bram Moolenaar1e015462005-09-25 22:16:38 +000067 let b:PHP_default_indenting = 0
Bram Moolenaar9ff70112005-07-11 22:29:03 +000068endif
69
Bram Moolenaare6ae6222013-05-21 21:01:10 +020070if exists("PHP_outdentSLComments")
Bram Moolenaarcbebd482016-02-07 23:02:56 +010071 let b:PHP_outdentSLComments = PHP_outdentSLComments * s:sw()
Bram Moolenaare6ae6222013-05-21 21:01:10 +020072else
73 let b:PHP_outdentSLComments = 0
74endif
75
Bram Moolenaar9ff70112005-07-11 22:29:03 +000076if exists("PHP_BracesAtCodeLevel")
Bram Moolenaar1e015462005-09-25 22:16:38 +000077 let b:PHP_BracesAtCodeLevel = PHP_BracesAtCodeLevel
Bram Moolenaar9ff70112005-07-11 22:29:03 +000078else
Bram Moolenaar1e015462005-09-25 22:16:38 +000079 let b:PHP_BracesAtCodeLevel = 0
Bram Moolenaar9ff70112005-07-11 22:29:03 +000080endif
81
Bram Moolenaarc236c162008-07-13 17:41:49 +000082
Bram Moolenaara5792f52005-11-23 21:25:05 +000083if exists("PHP_autoformatcomment")
84 let b:PHP_autoformatcomment = PHP_autoformatcomment
85else
86 let b:PHP_autoformatcomment = 1
87endif
Bram Moolenaar9ff70112005-07-11 22:29:03 +000088
Bram Moolenaar8408a9a2010-07-30 22:41:22 +020089if exists("PHP_outdentphpescape")
90 let b:PHP_outdentphpescape = PHP_outdentphpescape
91else
92 let b:PHP_outdentphpescape = 1
93endif
94
95
96if exists("PHP_vintage_case_default_indent") && PHP_vintage_case_default_indent
97 let b:PHP_vintage_case_default_indent = 1
Bram Moolenaarc236c162008-07-13 17:41:49 +000098else
99 let b:PHP_vintage_case_default_indent = 0
100endif
101
102
103
Bram Moolenaar9ff70112005-07-11 22:29:03 +0000104let b:PHP_lastindented = 0
105let b:PHP_indentbeforelast = 0
106let b:PHP_indentinghuge = 0
107let b:PHP_CurrentIndentLevel = b:PHP_default_indenting
108let b:PHP_LastIndentedWasComment = 0
109let b:PHP_InsideMultilineComment = 0
110let b:InPHPcode = 0
111let b:InPHPcode_checked = 0
112let b:InPHPcode_and_script = 0
113let b:InPHPcode_tofind = ""
114let b:PHP_oldchangetick = b:changedtick
115let b:UserIsTypingComment = 0
116let b:optionsset = 0
117
118setlocal nosmartindent
Bram Moolenaarc9b4b052006-04-30 18:54:39 +0000119setlocal noautoindent
Bram Moolenaar9ff70112005-07-11 22:29:03 +0000120setlocal nocindent
Bram Moolenaar1e015462005-09-25 22:16:38 +0000121setlocal nolisp
Bram Moolenaar9ff70112005-07-11 22:29:03 +0000122
Bram Moolenaar071d4272004-06-13 20:20:40 +0000123setlocal indentexpr=GetPhpIndent()
Bram Moolenaared32d942014-12-06 23:33:00 +0100124setlocal indentkeys=0{,0},0),0],:,!^F,o,O,e,*<Return>,=?>,=<?,=*/
Bram Moolenaar071d4272004-06-13 20:20:40 +0000125
Bram Moolenaar9ff70112005-07-11 22:29:03 +0000126
Bram Moolenaar1e015462005-09-25 22:16:38 +0000127
128let s:searchpairflags = 'bWr'
Bram Moolenaar9ff70112005-07-11 22:29:03 +0000129
130if &fileformat == "unix" && exists("PHP_removeCRwhenUnix") && PHP_removeCRwhenUnix
Bram Moolenaar1e015462005-09-25 22:16:38 +0000131 silent! %s/\r$//g
Bram Moolenaar9ff70112005-07-11 22:29:03 +0000132endif
133
Bram Moolenaar071d4272004-06-13 20:20:40 +0000134if exists("*GetPhpIndent")
Bram Moolenaar5c736222010-01-06 20:54:52 +0100135 call ResetPhpOptions()
Bram Moolenaarcbebd482016-02-07 23:02:56 +0100136 finish
Bram Moolenaar071d4272004-06-13 20:20:40 +0000137endif
138
Bram Moolenaarbcb98982014-05-01 14:08:19 +0200139
Bram Moolenaared32d942014-12-06 23:33:00 +0100140let s:PHP_validVariable = '[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*'
Bram Moolenaarbcb98982014-05-01 14:08:19 +0200141let s:notPhpHereDoc = '\%(break\|return\|continue\|exit\|die\|else\)'
142let 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 +0100143let s:functionDecl = '\<function\>\%(\s\+'.s:PHP_validVariable.'\)\=\s*(.*'
Bram Moolenaar9ff70112005-07-11 22:29:03 +0000144let s:endline= '\s*\%(//.*\|#.*\|/\*.*\*/\s*\)\=$'
Bram Moolenaared32d942014-12-06 23:33:00 +0100145
146
Bram Moolenaarcbebd482016-02-07 23:02:56 +0100147let s:terminated = '\%(\%(;\%(\s*\%(?>\|}\)\)\=\|<<<\s*[''"]\=\a\w*[''"]\=$\|^\s*}\|^\s*'.s:PHP_validVariable.':\)'.s:endline.'\)\|^[^''"`]*[''"`]$'
Bram Moolenaar9ff70112005-07-11 22:29:03 +0000148let s:PHP_startindenttag = '<?\%(.*?>\)\@!\|<script[^>]*>\%(.*<\/script>\)\@!'
Bram Moolenaar071d4272004-06-13 20:20:40 +0000149
Bram Moolenaar9ff70112005-07-11 22:29:03 +0000150
Bram Moolenaarbcb98982014-05-01 14:08:19 +0200151
152let s:escapeDebugStops = 0
Bram Moolenaare6ae6222013-05-21 21:01:10 +0200153function! DebugPrintReturn(scriptLine)
154
Bram Moolenaared32d942014-12-06 23:33:00 +0100155 if ! s:escapeDebugStops
Bram Moolenaarbcb98982014-05-01 14:08:19 +0200156 echo "debug:" . a:scriptLine
157 let c = getchar()
158 if c == "\<Del>"
159 let s:escapeDebugStops = 1
160 end
161 endif
Bram Moolenaare6ae6222013-05-21 21:01:10 +0200162
163endfunction
164
Bram Moolenaar9ff70112005-07-11 22:29:03 +0000165function! GetLastRealCodeLNum(startline) " {{{
Bram Moolenaarc9b4b052006-04-30 18:54:39 +0000166
Bram Moolenaar1e015462005-09-25 22:16:38 +0000167 let lnum = a:startline
Bram Moolenaarc9b4b052006-04-30 18:54:39 +0000168
Bram Moolenaar05a7bb32006-01-19 22:09:32 +0000169 if b:GetLastRealCodeLNum_ADD && b:GetLastRealCodeLNum_ADD == lnum + 1
170 let lnum = b:GetLastRealCodeLNum_ADD
171 endif
Bram Moolenaarc9b4b052006-04-30 18:54:39 +0000172
Bram Moolenaar1e015462005-09-25 22:16:38 +0000173 while lnum > 1
174 let lnum = prevnonblank(lnum)
175 let lastline = getline(lnum)
176
177 if b:InPHPcode_and_script && lastline =~ '?>\s*$'
178 let lnum = lnum - 1
179 elseif lastline =~ '^\s*?>.*<?\%(php\)\=\s*$'
180 let lnum = lnum - 1
181 elseif lastline =~ '^\s*\%(//\|#\|/\*.*\*/\s*$\)'
182 let lnum = lnum - 1
183 elseif lastline =~ '\*/\s*$'
184 call cursor(lnum, 1)
185 if lastline !~ '^\*/'
186 call search('\*/', 'W')
187 endif
Bram Moolenaara5792f52005-11-23 21:25:05 +0000188 let lnum = searchpair('/\*', '', '\*/', s:searchpairflags, 'Skippmatch2()')
Bram Moolenaar1e015462005-09-25 22:16:38 +0000189
190 let lastline = getline(lnum)
191 if lastline =~ '^\s*/\*'
192 let lnum = lnum - 1
193 else
194 break
195 endif
196
197
198 elseif lastline =~? '\%(//\s*\|?>.*\)\@<!<?\%(php\)\=\s*$\|^\s*<script\>'
199
200 while lastline !~ '\(<?.*\)\@<!?>' && lnum > 1
201 let lnum = lnum - 1
Bram Moolenaar9ff70112005-07-11 22:29:03 +0000202 let lastline = getline(lnum)
Bram Moolenaar1e015462005-09-25 22:16:38 +0000203 endwhile
204 if lastline =~ '^\s*?>'
205 let lnum = lnum - 1
206 else
207 break
208 endif
Bram Moolenaar9ff70112005-07-11 22:29:03 +0000209
210
Bram Moolenaar8408a9a2010-07-30 22:41:22 +0200211 elseif lastline =~? '^\a\w*;\=$' && lastline !~? s:notPhpHereDoc
Bram Moolenaarcbebd482016-02-07 23:02:56 +0100212 let tofind=substitute( lastline, '\(\a\w*\);\=', '<<<\\s*[''"]\\=\1[''"]\\=$', '')
Bram Moolenaar1e015462005-09-25 22:16:38 +0000213 while getline(lnum) !~? tofind && lnum > 1
214 let lnum = lnum - 1
215 endwhile
Bram Moolenaarbcb98982014-05-01 14:08:19 +0200216 elseif lastline =~ '^[^''"`]*[''"`][;,]'.s:endline
217 let tofind=substitute( lastline, '^.*\([''"`]\)[;,].*$', '^[^\1]\\+[\1]$', '')
218 while getline(lnum) !~? tofind && lnum > 1
219 let lnum = lnum - 1
220 endwhile
Bram Moolenaar1e015462005-09-25 22:16:38 +0000221 else
Bram Moolenaarc9b4b052006-04-30 18:54:39 +0000222 break
Bram Moolenaar9ff70112005-07-11 22:29:03 +0000223 endif
Bram Moolenaar1e015462005-09-25 22:16:38 +0000224 endwhile
225
Bram Moolenaar8408a9a2010-07-30 22:41:22 +0200226 if lnum==1 && getline(lnum) !~ '<?'
Bram Moolenaar1e015462005-09-25 22:16:38 +0000227 let lnum=0
228 endif
229
Bram Moolenaared32d942014-12-06 23:33:00 +0100230 if b:InPHPcode_and_script && 1 > b:InPHPcode
Bram Moolenaar1e015462005-09-25 22:16:38 +0000231 let b:InPHPcode_and_script = 0
232 endif
Bram Moolenaard5ab34b2007-05-05 17:15:44 +0000233
Bram Moolenaar1e015462005-09-25 22:16:38 +0000234 return lnum
235endfunction " }}}
Bram Moolenaar9ff70112005-07-11 22:29:03 +0000236
Bram Moolenaara5792f52005-11-23 21:25:05 +0000237function! Skippmatch2()
238
239 let line = getline(".")
240
Bram Moolenaare6ae6222013-05-21 21:01:10 +0200241 if line =~ "\\([\"']\\).*/\\*.*\\1" || line =~ '\%(//\|#\).*/\*'
Bram Moolenaarbcb98982014-05-01 14:08:19 +0200242 return 1
Bram Moolenaare6ae6222013-05-21 21:01:10 +0200243 else
Bram Moolenaarbcb98982014-05-01 14:08:19 +0200244 return 0
Bram Moolenaare6ae6222013-05-21 21:01:10 +0200245 endif
Bram Moolenaara5792f52005-11-23 21:25:05 +0000246endfun
247
Bram Moolenaar8408a9a2010-07-30 22:41:22 +0200248function! Skippmatch() " {{{
Bram Moolenaar1e015462005-09-25 22:16:38 +0000249 let synname = synIDattr(synID(line("."), col("."), 0), "name")
Bram Moolenaared32d942014-12-06 23:33:00 +0100250 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 +0000251 return 0
252 else
253 return 1
254 endif
255endfun " }}}
Bram Moolenaar9ff70112005-07-11 22:29:03 +0000256
Bram Moolenaarbcb98982014-05-01 14:08:19 +0200257function! FindOpenBracket(lnum, blockStarter) " {{{
Bram Moolenaar1e015462005-09-25 22:16:38 +0000258 call cursor(a:lnum, 1)
Bram Moolenaarbcb98982014-05-01 14:08:19 +0200259 let line = searchpair('{', '', '}', 'bW', 'Skippmatch()')
260
261 if a:blockStarter == 1
Bram Moolenaared32d942014-12-06 23:33:00 +0100262 while line > 1
Bram Moolenaarbcb98982014-05-01 14:08:19 +0200263 let linec = getline(line)
264
265 if linec =~ s:terminated || linec =~ '^\s*\%(' . s:blockstart . '\)\|'. s:functionDecl . s:endline
266 break
267 endif
268
269 let line = GetLastRealCodeLNum(line - 1)
270 endwhile
271 endif
272
273 return line
Bram Moolenaar1e015462005-09-25 22:16:38 +0000274endfun " }}}
Bram Moolenaar9ff70112005-07-11 22:29:03 +0000275
276function! FindTheIfOfAnElse (lnum, StopAfterFirstPrevElse) " {{{
Bram Moolenaar1e015462005-09-25 22:16:38 +0000277
278 if getline(a:lnum) =~# '^\s*}\s*else\%(if\)\=\>'
279 let beforeelse = a:lnum
280 else
281 let beforeelse = GetLastRealCodeLNum(a:lnum - 1)
282 endif
283
284 if !s:level
285 let s:iftoskip = 0
286 endif
287
288 if getline(beforeelse) =~# '^\s*\%(}\s*\)\=else\%(\s*if\)\@!\>'
289 let s:iftoskip = s:iftoskip + 1
290 endif
291
292 if getline(beforeelse) =~ '^\s*}'
Bram Moolenaarbcb98982014-05-01 14:08:19 +0200293 let beforeelse = FindOpenBracket(beforeelse, 0)
Bram Moolenaar1e015462005-09-25 22:16:38 +0000294
295 if getline(beforeelse) =~ '^\s*{'
296 let beforeelse = GetLastRealCodeLNum(beforeelse - 1)
Bram Moolenaar9ff70112005-07-11 22:29:03 +0000297 endif
Bram Moolenaar1e015462005-09-25 22:16:38 +0000298 endif
Bram Moolenaar9ff70112005-07-11 22:29:03 +0000299
300
Bram Moolenaar1e015462005-09-25 22:16:38 +0000301 if !s:iftoskip && a:StopAfterFirstPrevElse && getline(beforeelse) =~# '^\s*\%([}]\s*\)\=else\%(if\)\=\>'
Bram Moolenaar9ff70112005-07-11 22:29:03 +0000302 return beforeelse
Bram Moolenaar1e015462005-09-25 22:16:38 +0000303 endif
Bram Moolenaar9ff70112005-07-11 22:29:03 +0000304
Bram Moolenaar1e015462005-09-25 22:16:38 +0000305 if getline(beforeelse) !~# '^\s*if\>' && beforeelse>1 || s:iftoskip && beforeelse>1
306
Bram Moolenaar8408a9a2010-07-30 22:41:22 +0200307 if s:iftoskip && getline(beforeelse) =~# '^\s*if\>'
Bram Moolenaar1e015462005-09-25 22:16:38 +0000308 let s:iftoskip = s:iftoskip - 1
309 endif
310
311 let s:level = s:level + 1
312 let beforeelse = FindTheIfOfAnElse(beforeelse, a:StopAfterFirstPrevElse)
313 endif
314
315 return beforeelse
316
317endfunction " }}}
Bram Moolenaar9ff70112005-07-11 22:29:03 +0000318
Bram Moolenaar8408a9a2010-07-30 22:41:22 +0200319let s:defaultORcase = '^\s*\%(default\|case\).*:'
320
321function! FindTheSwitchIndent (lnum) " {{{
322
Bram Moolenaar8408a9a2010-07-30 22:41:22 +0200323 let test = GetLastRealCodeLNum(a:lnum - 1)
324
325 if test <= 1
Bram Moolenaarcbebd482016-02-07 23:02:56 +0100326 return indent(1) - s:sw() * b:PHP_vintage_case_default_indent
Bram Moolenaar8408a9a2010-07-30 22:41:22 +0200327 end
328
Bram Moolenaarbcb98982014-05-01 14:08:19 +0200329 while getline(test) =~ '^\s*}' && test > 1
330 let test = GetLastRealCodeLNum(FindOpenBracket(test, 0) - 1)
Bram Moolenaar8408a9a2010-07-30 22:41:22 +0200331
Bram Moolenaarbcb98982014-05-01 14:08:19 +0200332 if getline(test) =~ '^\s*switch\>'
333 let test = GetLastRealCodeLNum(test - 1)
Bram Moolenaar8408a9a2010-07-30 22:41:22 +0200334 endif
Bram Moolenaarbcb98982014-05-01 14:08:19 +0200335 endwhile
Bram Moolenaar8408a9a2010-07-30 22:41:22 +0200336
337 if getline(test) =~# '^\s*switch\>'
338 return indent(test)
339 elseif getline(test) =~# s:defaultORcase
Bram Moolenaarcbebd482016-02-07 23:02:56 +0100340 return indent(test) - s:sw() * b:PHP_vintage_case_default_indent
Bram Moolenaar8408a9a2010-07-30 22:41:22 +0200341 else
342 return FindTheSwitchIndent(test)
343 endif
344
345endfunction "}}}
346
Bram Moolenaar3b1db362013-08-10 15:00:24 +0200347let s:SynPHPMatchGroups = {'phpParent':1, 'Delimiter':1, 'Define':1, 'Storageclass':1, 'StorageClass':1, 'Structure':1, 'Exception':1}
Bram Moolenaar9ff70112005-07-11 22:29:03 +0000348function! IslinePHP (lnum, tofind) " {{{
Bram Moolenaar1e015462005-09-25 22:16:38 +0000349 let cline = getline(a:lnum)
Bram Moolenaar9ff70112005-07-11 22:29:03 +0000350
Bram Moolenaar1e015462005-09-25 22:16:38 +0000351 if a:tofind==""
Bram Moolenaarbcb98982014-05-01 14:08:19 +0200352 let tofind = "^\\s*[\"'`]*\\s*\\zs\\S"
Bram Moolenaar1e015462005-09-25 22:16:38 +0000353 else
354 let tofind = a:tofind
355 endif
Bram Moolenaar9ff70112005-07-11 22:29:03 +0000356
Bram Moolenaar1e015462005-09-25 22:16:38 +0000357 let tofind = tofind . '\c'
Bram Moolenaar9ff70112005-07-11 22:29:03 +0000358
Bram Moolenaar1e015462005-09-25 22:16:38 +0000359 let coltotest = match (cline, tofind) + 1
Bram Moolenaar9ff70112005-07-11 22:29:03 +0000360
Bram Moolenaar1e015462005-09-25 22:16:38 +0000361 let synname = synIDattr(synID(a:lnum, coltotest, 0), "name")
362
Bram Moolenaarbcb98982014-05-01 14:08:19 +0200363 if synname == 'phpStringSingle' || synname == 'phpStringDouble' || synname == 'phpBacktick'
364 if cline !~ '^\s*[''"`]'
Bram Moolenaared32d942014-12-06 23:33:00 +0100365 return "SpecStringEntrails"
Bram Moolenaarbcb98982014-05-01 14:08:19 +0200366 else
367 return synname
368 end
369 end
370
Bram Moolenaar9d98fe92013-08-03 18:35:36 +0200371 if get(s:SynPHPMatchGroups, synname) || synname =~ '^php' || synname =~? '^javaScript'
Bram Moolenaar1e015462005-09-25 22:16:38 +0000372 return synname
373 else
374 return ""
375 endif
376endfunction " }}}
Bram Moolenaar9ff70112005-07-11 22:29:03 +0000377
Bram Moolenaar5c736222010-01-06 20:54:52 +0100378let s:autoresetoptions = 0
379if ! s:autoresetoptions
380 let s:autoresetoptions = 1
Bram Moolenaar9ff70112005-07-11 22:29:03 +0000381endif
382
Bram Moolenaar5c736222010-01-06 20:54:52 +0100383function! ResetPhpOptions()
Bram Moolenaared32d942014-12-06 23:33:00 +0100384 if ! b:optionsset && &filetype =~ "php"
Bram Moolenaara5792f52005-11-23 21:25:05 +0000385 if b:PHP_autoformatcomment
386
387 setlocal comments=s1:/*,mb:*,ex:*/,://,:#
Bram Moolenaarc9b4b052006-04-30 18:54:39 +0000388
Bram Moolenaarc236c162008-07-13 17:41:49 +0000389 setlocal formatoptions-=t
Bram Moolenaara5792f52005-11-23 21:25:05 +0000390 setlocal formatoptions+=q
391 setlocal formatoptions+=r
392 setlocal formatoptions+=o
Bram Moolenaara5792f52005-11-23 21:25:05 +0000393 setlocal formatoptions+=c
394 setlocal formatoptions+=b
395 endif
Bram Moolenaar1e015462005-09-25 22:16:38 +0000396 let b:optionsset = 1
397 endif
Bram Moolenaar9ff70112005-07-11 22:29:03 +0000398endfunc
399
Bram Moolenaar5c736222010-01-06 20:54:52 +0100400call ResetPhpOptions()
401
Bram Moolenaar9ff70112005-07-11 22:29:03 +0000402function! GetPhpIndent()
Bram Moolenaar9ff70112005-07-11 22:29:03 +0000403
Bram Moolenaar05a7bb32006-01-19 22:09:32 +0000404 let b:GetLastRealCodeLNum_ADD = 0
405
Bram Moolenaar1e015462005-09-25 22:16:38 +0000406 let UserIsEditing=0
407 if b:PHP_oldchangetick != b:changedtick
408 let b:PHP_oldchangetick = b:changedtick
409 let UserIsEditing=1
410 endif
411
412 if b:PHP_default_indenting
Bram Moolenaarcbebd482016-02-07 23:02:56 +0100413 let b:PHP_default_indenting = g:PHP_default_indenting * s:sw()
Bram Moolenaar1e015462005-09-25 22:16:38 +0000414 endif
415
416 let cline = getline(v:lnum)
417
Bram Moolenaarc9b4b052006-04-30 18:54:39 +0000418 if !b:PHP_indentinghuge && b:PHP_lastindented > b:PHP_indentbeforelast
Bram Moolenaar1e015462005-09-25 22:16:38 +0000419 if b:PHP_indentbeforelast
420 let b:PHP_indentinghuge = 1
Bram Moolenaar9ff70112005-07-11 22:29:03 +0000421 endif
Bram Moolenaar1e015462005-09-25 22:16:38 +0000422 let b:PHP_indentbeforelast = b:PHP_lastindented
423 endif
Bram Moolenaar9ff70112005-07-11 22:29:03 +0000424
Bram Moolenaar1e015462005-09-25 22:16:38 +0000425 if b:InPHPcode_checked && prevnonblank(v:lnum - 1) != b:PHP_lastindented
426 if b:PHP_indentinghuge
Bram Moolenaar1e015462005-09-25 22:16:38 +0000427 let b:PHP_indentinghuge = 0
428 let b:PHP_CurrentIndentLevel = b:PHP_default_indenting
Bram Moolenaar9ff70112005-07-11 22:29:03 +0000429 endif
Bram Moolenaared32d942014-12-06 23:33:00 +0100430 let real_PHP_lastindented = v:lnum
Bram Moolenaar1e015462005-09-25 22:16:38 +0000431 let b:PHP_LastIndentedWasComment=0
432 let b:PHP_InsideMultilineComment=0
433 let b:PHP_indentbeforelast = 0
Bram Moolenaar9ff70112005-07-11 22:29:03 +0000434
Bram Moolenaar1e015462005-09-25 22:16:38 +0000435 let b:InPHPcode = 0
436 let b:InPHPcode_checked = 0
437 let b:InPHPcode_and_script = 0
438 let b:InPHPcode_tofind = ""
Bram Moolenaar9ff70112005-07-11 22:29:03 +0000439
Bram Moolenaar1e015462005-09-25 22:16:38 +0000440 elseif v:lnum > b:PHP_lastindented
441 let real_PHP_lastindented = b:PHP_lastindented
Bram Moolenaared32d942014-12-06 23:33:00 +0100442 else
443 let real_PHP_lastindented = v:lnum
Bram Moolenaar1e015462005-09-25 22:16:38 +0000444 endif
Bram Moolenaar9ff70112005-07-11 22:29:03 +0000445
Bram Moolenaared32d942014-12-06 23:33:00 +0100446 let b:PHP_lastindented = v:lnum
447
Bram Moolenaar1e015462005-09-25 22:16:38 +0000448
449 if !b:InPHPcode_checked " {{{ One time check
450 let b:InPHPcode_checked = 1
Bram Moolenaarcbebd482016-02-07 23:02:56 +0100451 let b:UserIsTypingComment = 0
Bram Moolenaar1e015462005-09-25 22:16:38 +0000452
Bram Moolenaar05a7bb32006-01-19 22:09:32 +0000453 let synname = ""
454 if cline !~ '<?.*?>'
455 let synname = IslinePHP (prevnonblank(v:lnum), "")
456 endif
Bram Moolenaar1e015462005-09-25 22:16:38 +0000457
458 if synname!=""
Bram Moolenaared32d942014-12-06 23:33:00 +0100459 if synname == "SpecStringEntrails"
Bram Moolenaarcbebd482016-02-07 23:02:56 +0100460 let b:InPHPcode = -1
Bram Moolenaared32d942014-12-06 23:33:00 +0100461 let b:InPHPcode_tofind = ""
462 elseif synname != "phpHereDoc" && synname != "phpHereDocDelimiter"
Bram Moolenaar1e015462005-09-25 22:16:38 +0000463 let b:InPHPcode = 1
Bram Moolenaar9ff70112005-07-11 22:29:03 +0000464 let b:InPHPcode_tofind = ""
465
Bram Moolenaared32d942014-12-06 23:33:00 +0100466 if synname =~# '^php\%(Doc\)\?Comment'
Bram Moolenaar1e015462005-09-25 22:16:38 +0000467 let b:UserIsTypingComment = 1
Bram Moolenaarcbebd482016-02-07 23:02:56 +0100468 let b:InPHPcode_checked = 0
Bram Moolenaar9ff70112005-07-11 22:29:03 +0000469 endif
Bram Moolenaar9ff70112005-07-11 22:29:03 +0000470
Bram Moolenaar1e015462005-09-25 22:16:38 +0000471 if synname =~? '^javaScript'
472 let b:InPHPcode_and_script = 1
Bram Moolenaar9ff70112005-07-11 22:29:03 +0000473 endif
Bram Moolenaar9ff70112005-07-11 22:29:03 +0000474
Bram Moolenaar1e015462005-09-25 22:16:38 +0000475 else
476 let b:InPHPcode = 0
Bram Moolenaar9ff70112005-07-11 22:29:03 +0000477
Bram Moolenaar1e015462005-09-25 22:16:38 +0000478 let lnum = v:lnum - 1
Bram Moolenaarcbebd482016-02-07 23:02:56 +0100479 while getline(lnum) !~? '<<<\s*[''"]\=\a\w*[''"]\=$' && lnum > 1
Bram Moolenaar1e015462005-09-25 22:16:38 +0000480 let lnum = lnum - 1
Bram Moolenaar9ff70112005-07-11 22:29:03 +0000481 endwhile
482
Bram Moolenaarcbebd482016-02-07 23:02:56 +0100483 let b:InPHPcode_tofind = substitute( getline(lnum), '^.*<<<\s*[''"]\=\(\a\w*\)[''"]\=$', '^\\s*\1;\\=$', '')
Bram Moolenaar1e015462005-09-25 22:16:38 +0000484 endif
485 else
486 let b:InPHPcode = 0
Bram Moolenaare6ae6222013-05-21 21:01:10 +0200487 let b:InPHPcode_tofind = s:PHP_startindenttag
Bram Moolenaar9ff70112005-07-11 22:29:03 +0000488 endif
Bram Moolenaar1e015462005-09-25 22:16:38 +0000489 endif "!b:InPHPcode_checked }}}
Bram Moolenaar9ff70112005-07-11 22:29:03 +0000490
491
Bram Moolenaar1e015462005-09-25 22:16:38 +0000492 " Test if we are indenting PHP code {{{
493 let lnum = prevnonblank(v:lnum - 1)
494 let last_line = getline(lnum)
Bram Moolenaarbcb98982014-05-01 14:08:19 +0200495 let endline= s:endline
Bram Moolenaar1e015462005-09-25 22:16:38 +0000496
497 if b:InPHPcode_tofind!=""
498 if cline =~? b:InPHPcode_tofind
Bram Moolenaar1e015462005-09-25 22:16:38 +0000499 let b:InPHPcode_tofind = ""
500 let b:UserIsTypingComment = 0
Bram Moolenaared32d942014-12-06 23:33:00 +0100501
502 if b:InPHPcode == -1
503 let b:InPHPcode = 1
504 return -1
505 end
506
507 let b:InPHPcode = 1
508
Bram Moolenaar1e015462005-09-25 22:16:38 +0000509 if cline =~ '\*/'
510 call cursor(v:lnum, 1)
511 if cline !~ '^\*/'
512 call search('\*/', 'W')
Bram Moolenaar9ff70112005-07-11 22:29:03 +0000513 endif
Bram Moolenaara5792f52005-11-23 21:25:05 +0000514 let lnum = searchpair('/\*', '', '\*/', s:searchpairflags, 'Skippmatch2()')
Bram Moolenaar9ff70112005-07-11 22:29:03 +0000515
Bram Moolenaar1e015462005-09-25 22:16:38 +0000516 let b:PHP_CurrentIndentLevel = b:PHP_default_indenting
Bram Moolenaar9ff70112005-07-11 22:29:03 +0000517
Bram Moolenaar1e015462005-09-25 22:16:38 +0000518 let b:PHP_LastIndentedWasComment = 0
Bram Moolenaar9ff70112005-07-11 22:29:03 +0000519
Bram Moolenaar1e015462005-09-25 22:16:38 +0000520 if cline =~ '^\s*\*/'
521 return indent(lnum) + 1
522 else
523 return indent(lnum)
Bram Moolenaar9ff70112005-07-11 22:29:03 +0000524 endif
525
Bram Moolenaar1e015462005-09-25 22:16:38 +0000526 elseif cline =~? '<script\>'
527 let b:InPHPcode_and_script = 1
Bram Moolenaar05a7bb32006-01-19 22:09:32 +0000528 let b:GetLastRealCodeLNum_ADD = v:lnum
Bram Moolenaar1e015462005-09-25 22:16:38 +0000529 endif
Bram Moolenaar9ff70112005-07-11 22:29:03 +0000530 endif
Bram Moolenaar1e015462005-09-25 22:16:38 +0000531 endif
Bram Moolenaar9ff70112005-07-11 22:29:03 +0000532
Bram Moolenaared32d942014-12-06 23:33:00 +0100533 if 1 == b:InPHPcode
Bram Moolenaar1e015462005-09-25 22:16:38 +0000534
Bram Moolenaard5ab34b2007-05-05 17:15:44 +0000535 if !b:InPHPcode_and_script && last_line =~ '\%(<?.*\)\@<!?>\%(.*<?\)\@!' && IslinePHP(lnum, '?>')=~"Delimiter"
Bram Moolenaar1e015462005-09-25 22:16:38 +0000536 if cline !~? s:PHP_startindenttag
537 let b:InPHPcode = 0
538 let b:InPHPcode_tofind = s:PHP_startindenttag
539 elseif cline =~? '<script\>'
540 let b:InPHPcode_and_script = 1
541 endif
542
Bram Moolenaared32d942014-12-06 23:33:00 +0100543 elseif last_line =~ '^[^''"`]\+[''"`]$'
544 let b:InPHPcode = -1
Bram Moolenaarbcb98982014-05-01 14:08:19 +0200545 let b:InPHPcode_tofind = substitute( last_line, '^.*\([''"`]\).*$', '^[^\1]*\1[;,]$', '')
Bram Moolenaarcbebd482016-02-07 23:02:56 +0100546 elseif last_line =~? '<<<\s*[''"]\=\a\w*[''"]\=$'
Bram Moolenaar1e015462005-09-25 22:16:38 +0000547 let b:InPHPcode = 0
Bram Moolenaarcbebd482016-02-07 23:02:56 +0100548 let b:InPHPcode_tofind = substitute( last_line, '^.*<<<\s*[''"]\=\(\a\w*\)[''"]\=$', '^\\s*\1;\\=$', '')
Bram Moolenaar1e015462005-09-25 22:16:38 +0000549
550 elseif !UserIsEditing && cline =~ '^\s*/\*\%(.*\*/\)\@!' && getline(v:lnum + 1) !~ '^\s*\*'
551 let b:InPHPcode = 0
552 let b:InPHPcode_tofind = '\*/'
553
554 elseif cline =~? '^\s*</script>'
555 let b:InPHPcode = 0
556 let b:InPHPcode_tofind = s:PHP_startindenttag
Bram Moolenaar9ff70112005-07-11 22:29:03 +0000557 endif
Bram Moolenaar1e015462005-09-25 22:16:38 +0000558 endif " }}}
Bram Moolenaar9ff70112005-07-11 22:29:03 +0000559
Bram Moolenaarc9b4b052006-04-30 18:54:39 +0000560
Bram Moolenaared32d942014-12-06 23:33:00 +0100561 if 1 > b:InPHPcode && !b:InPHPcode_and_script
Bram Moolenaar1e015462005-09-25 22:16:38 +0000562 return -1
563 endif
564
Bram Moolenaar1e015462005-09-25 22:16:38 +0000565 " Indent successive // or # comment the same way the first is {{{
Bram Moolenaare6ae6222013-05-21 21:01:10 +0200566 let addSpecial = 0
Bram Moolenaar1e015462005-09-25 22:16:38 +0000567 if cline =~ '^\s*\%(//\|#\|/\*.*\*/\s*$\)'
Bram Moolenaare6ae6222013-05-21 21:01:10 +0200568 let addSpecial = b:PHP_outdentSLComments
Bram Moolenaar1e015462005-09-25 22:16:38 +0000569 if b:PHP_LastIndentedWasComment == 1
570 return indent(real_PHP_lastindented)
571 endif
572 let b:PHP_LastIndentedWasComment = 1
573 else
574 let b:PHP_LastIndentedWasComment = 0
575 endif " }}}
576
577 " Indent multiline /* comments correctly {{{
578
579 if b:PHP_InsideMultilineComment || b:UserIsTypingComment
580 if cline =~ '^\s*\*\%(\/\)\@!'
581 if last_line =~ '^\s*/\*'
582 return indent(lnum) + 1
583 else
584 return indent(lnum)
585 endif
586 else
587 let b:PHP_InsideMultilineComment = 0
588 endif
589 endif
590
Bram Moolenaared32d942014-12-06 23:33:00 +0100591 if !b:PHP_InsideMultilineComment && cline =~ '^\s*/\*\%(.*\*/\)\@!'
Bram Moolenaar05a7bb32006-01-19 22:09:32 +0000592 if getline(v:lnum + 1) !~ '^\s*\*'
593 return -1
594 endif
Bram Moolenaar1e015462005-09-25 22:16:38 +0000595 let b:PHP_InsideMultilineComment = 1
Bram Moolenaar1e015462005-09-25 22:16:38 +0000596 endif " }}}
597
598
599 " Things always indented at col 1 (PHP delimiter: <?, ?>, Heredoc end) {{{
Bram Moolenaar8408a9a2010-07-30 22:41:22 +0200600 if cline =~# '^\s*<?' && cline !~ '?>' && b:PHP_outdentphpescape
Bram Moolenaar1e015462005-09-25 22:16:38 +0000601 return 0
602 endif
603
Bram Moolenaar8408a9a2010-07-30 22:41:22 +0200604 if cline =~ '^\s*?>' && cline !~# '<?' && b:PHP_outdentphpescape
Bram Moolenaar1e015462005-09-25 22:16:38 +0000605 return 0
606 endif
607
Bram Moolenaarbcb98982014-05-01 14:08:19 +0200608 if cline =~? '^\s*\a\w*;$\|^\a\w*$\|^\s*[''"`][;,]' && cline !~? s:notPhpHereDoc
Bram Moolenaar1e015462005-09-25 22:16:38 +0000609 return 0
610 endif " }}}
611
612 let s:level = 0
613
614 let lnum = GetLastRealCodeLNum(v:lnum - 1)
Bram Moolenaar05a7bb32006-01-19 22:09:32 +0000615
Bram Moolenaar1e015462005-09-25 22:16:38 +0000616 let last_line = getline(lnum)
617 let ind = indent(lnum)
Bram Moolenaar1e015462005-09-25 22:16:38 +0000618
619 if ind==0 && b:PHP_default_indenting
620 let ind = b:PHP_default_indenting
621 endif
622
623 if lnum == 0
Bram Moolenaare6ae6222013-05-21 21:01:10 +0200624 return b:PHP_default_indenting + addSpecial
Bram Moolenaar1e015462005-09-25 22:16:38 +0000625 endif
626
627
628 if cline =~ '^\s*}\%(}}\)\@!'
Bram Moolenaarbcb98982014-05-01 14:08:19 +0200629 let ind = indent(FindOpenBracket(v:lnum, 1))
Bram Moolenaar1e015462005-09-25 22:16:38 +0000630 let b:PHP_CurrentIndentLevel = b:PHP_default_indenting
Bram Moolenaar9ff70112005-07-11 22:29:03 +0000631 return ind
Bram Moolenaar1e015462005-09-25 22:16:38 +0000632 endif
633
634 if cline =~ '^\s*\*/'
635 call cursor(v:lnum, 1)
636 if cline !~ '^\*/'
637 call search('\*/', 'W')
638 endif
Bram Moolenaara5792f52005-11-23 21:25:05 +0000639 let lnum = searchpair('/\*', '', '\*/', s:searchpairflags, 'Skippmatch2()')
Bram Moolenaar1e015462005-09-25 22:16:38 +0000640
641 let b:PHP_CurrentIndentLevel = b:PHP_default_indenting
642
643 if cline =~ '^\s*\*/'
644 return indent(lnum) + 1
645 else
646 return indent(lnum)
647 endif
648 endif
649
Bram Moolenaar1e015462005-09-25 22:16:38 +0000650
Bram Moolenaare6ae6222013-05-21 21:01:10 +0200651 if last_line =~ '[;}]'.endline && last_line !~ '^[)\]]' && last_line !~# s:defaultORcase
Bram Moolenaar1e015462005-09-25 22:16:38 +0000652 if ind==b:PHP_default_indenting
Bram Moolenaare6ae6222013-05-21 21:01:10 +0200653 return b:PHP_default_indenting + addSpecial
Bram Moolenaar1e015462005-09-25 22:16:38 +0000654 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 +0200655 return b:PHP_CurrentIndentLevel + addSpecial
Bram Moolenaar1e015462005-09-25 22:16:38 +0000656 endif
657 endif
658
659 let LastLineClosed = 0
660
Bram Moolenaarbcb98982014-05-01 14:08:19 +0200661 let terminated = s:terminated
Bram Moolenaar1e015462005-09-25 22:16:38 +0000662
663 let unstated = '\%(^\s*'.s:blockstart.'.*)\|\%(//.*\)\@<!\<e'.'lse\>\)'.endline
664
665 if ind != b:PHP_default_indenting && cline =~# '^\s*else\%(if\)\=\>'
666 let b:PHP_CurrentIndentLevel = b:PHP_default_indenting
667 return indent(FindTheIfOfAnElse(v:lnum, 1))
Bram Moolenaar8408a9a2010-07-30 22:41:22 +0200668 elseif cline =~# s:defaultORcase
Bram Moolenaarcbebd482016-02-07 23:02:56 +0100669 return FindTheSwitchIndent(v:lnum) + s:sw() * b:PHP_vintage_case_default_indent
Bram Moolenaarc236c162008-07-13 17:41:49 +0000670 elseif cline =~ '^\s*)\=\s*{'
Bram Moolenaar1e015462005-09-25 22:16:38 +0000671 let previous_line = last_line
672 let last_line_num = lnum
673
674 while last_line_num > 1
675
Bram Moolenaarbcb98982014-05-01 14:08:19 +0200676 if previous_line =~ terminated || previous_line =~ '^\s*\%(' . s:blockstart . '\)\|'. s:functionDecl . endline
Bram Moolenaar1e015462005-09-25 22:16:38 +0000677
678 let ind = indent(last_line_num)
679
680 if b:PHP_BracesAtCodeLevel
Bram Moolenaarcbebd482016-02-07 23:02:56 +0100681 let ind = ind + s:sw()
Bram Moolenaar1e015462005-09-25 22:16:38 +0000682 endif
683
Bram Moolenaarc9b4b052006-04-30 18:54:39 +0000684 return ind
Bram Moolenaar1e015462005-09-25 22:16:38 +0000685 endif
686
Bram Moolenaarbcb98982014-05-01 14:08:19 +0200687 let last_line_num = GetLastRealCodeLNum(last_line_num - 1)
Bram Moolenaar1e015462005-09-25 22:16:38 +0000688 let previous_line = getline(last_line_num)
689 endwhile
690
Bram Moolenaarc236c162008-07-13 17:41:49 +0000691 elseif last_line =~# unstated && cline !~ '^\s*);\='.endline
Bram Moolenaarcbebd482016-02-07 23:02:56 +0100692 let ind = ind + s:sw()
Bram Moolenaare6ae6222013-05-21 21:01:10 +0200693 return ind + addSpecial
Bram Moolenaar1e015462005-09-25 22:16:38 +0000694
Bram Moolenaared32d942014-12-06 23:33:00 +0100695 elseif (ind != b:PHP_default_indenting || last_line =~ '^[)\]]' ) && last_line =~ terminated
Bram Moolenaar1e015462005-09-25 22:16:38 +0000696 let previous_line = last_line
697 let last_line_num = lnum
698 let LastLineClosed = 1
699
Bram Moolenaarbcb98982014-05-01 14:08:19 +0200700 let isSingleLineBlock = 0
Bram Moolenaar1e015462005-09-25 22:16:38 +0000701 while 1
Bram Moolenaared32d942014-12-06 23:33:00 +0100702 if ! isSingleLineBlock && previous_line =~ '^\s*}\|;\s*}'.endline
Bram Moolenaar1e015462005-09-25 22:16:38 +0000703
Bram Moolenaare6ae6222013-05-21 21:01:10 +0200704 call cursor(last_line_num, 1)
Bram Moolenaarbcb98982014-05-01 14:08:19 +0200705 if previous_line !~ '^}'
706 call search('}\|;\s*}'.endline, 'W')
707 end
Bram Moolenaare6ae6222013-05-21 21:01:10 +0200708 let oldLastLine = last_line_num
709 let last_line_num = searchpair('{', '', '}', 'bW', 'Skippmatch()')
710
Bram Moolenaarbcb98982014-05-01 14:08:19 +0200711 if getline(last_line_num) =~ '^\s*{'
Bram Moolenaar1e015462005-09-25 22:16:38 +0000712 let last_line_num = GetLastRealCodeLNum(last_line_num - 1)
Bram Moolenaarbcb98982014-05-01 14:08:19 +0200713 elseif oldLastLine == last_line_num
714 let isSingleLineBlock = 1
715 continue
Bram Moolenaar1e015462005-09-25 22:16:38 +0000716 endif
717
718 let previous_line = getline(last_line_num)
719
720 continue
721 else
Bram Moolenaarbcb98982014-05-01 14:08:19 +0200722 let isSingleLineBlock = 0
Bram Moolenaar1e015462005-09-25 22:16:38 +0000723
724 if getline(last_line_num) =~# '^\s*else\%(if\)\=\>'
725 let last_line_num = FindTheIfOfAnElse(last_line_num, 0)
726 continue
727 endif
728
729
730 let last_match = last_line_num
731
732 let one_ahead_indent = indent(last_line_num)
733 let last_line_num = GetLastRealCodeLNum(last_line_num - 1)
734 let two_ahead_indent = indent(last_line_num)
735 let after_previous_line = previous_line
736 let previous_line = getline(last_line_num)
737
738
Bram Moolenaar8408a9a2010-07-30 22:41:22 +0200739 if previous_line =~# s:defaultORcase.'\|{'.endline
Bram Moolenaar1e015462005-09-25 22:16:38 +0000740 break
741 endif
742
743 if after_previous_line=~# '^\s*'.s:blockstart.'.*)'.endline && previous_line =~# '[;}]'.endline
744 break
745 endif
746
Bram Moolenaarc9b4b052006-04-30 18:54:39 +0000747 if one_ahead_indent == two_ahead_indent || last_line_num < 1
Bram Moolenaarc236c162008-07-13 17:41:49 +0000748 if previous_line =~# '\%(;\|^\s*}\)'.endline || last_line_num < 1
Bram Moolenaar1e015462005-09-25 22:16:38 +0000749 break
750 endif
751 endif
752 endif
753 endwhile
754
755 if indent(last_match) != ind
756 let ind = indent(last_match)
757 let b:PHP_CurrentIndentLevel = b:PHP_default_indenting
758
Bram Moolenaare6ae6222013-05-21 21:01:10 +0200759 return ind + addSpecial
Bram Moolenaar1e015462005-09-25 22:16:38 +0000760 endif
761 endif
762
Bram Moolenaared32d942014-12-06 23:33:00 +0100763 if (last_line !~ '^\s*}\%(}}\)\@!')
764 let plinnum = GetLastRealCodeLNum(lnum - 1)
765 else
766 let plinnum = GetLastRealCodeLNum(FindOpenBracket(lnum, 1) - 1)
767 endif
768
Bram Moolenaar8408a9a2010-07-30 22:41:22 +0200769 let AntepenultimateLine = getline(plinnum)
Bram Moolenaar1e015462005-09-25 22:16:38 +0000770
771 let last_line = substitute(last_line,"\\(//\\|#\\)\\(\\(\\([^\"']*\\([\"']\\)[^\"']*\\5\\)\\+[^\"']*$\\)\\|\\([^\"']*$\\)\\)",'','')
772
773
774 if ind == b:PHP_default_indenting
Bram Moolenaared32d942014-12-06 23:33:00 +0100775 if last_line =~ terminated && last_line !~# s:defaultORcase
Bram Moolenaar1e015462005-09-25 22:16:38 +0000776 let LastLineClosed = 1
777 endif
778 endif
779
780 if !LastLineClosed
781
Bram Moolenaar5c736222010-01-06 20:54:52 +0100782
Bram Moolenaared32d942014-12-06 23:33:00 +0100783 if last_line =~# '[{(\[]'.endline || last_line =~? '\h\w*\s*(.*,$' && AntepenultimateLine !~ '[,(\[]'.endline
Bram Moolenaar1e015462005-09-25 22:16:38 +0000784
Bram Moolenaarbcb98982014-05-01 14:08:19 +0200785 let dontIndent = 0
Bram Moolenaared32d942014-12-06 23:33:00 +0100786 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 +0200787 let dontIndent = 1
788 endif
789
790 if !dontIndent && (!b:PHP_BracesAtCodeLevel || last_line !~# '^\s*{')
Bram Moolenaarcbebd482016-02-07 23:02:56 +0100791 let ind = ind + s:sw()
Bram Moolenaar1e015462005-09-25 22:16:38 +0000792 endif
793
Bram Moolenaar8408a9a2010-07-30 22:41:22 +0200794 if b:PHP_BracesAtCodeLevel || b:PHP_vintage_case_default_indent == 1
Bram Moolenaar1e015462005-09-25 22:16:38 +0000795 let b:PHP_CurrentIndentLevel = ind
Bram Moolenaarc236c162008-07-13 17:41:49 +0000796
Bram Moolenaare6ae6222013-05-21 21:01:10 +0200797 return ind + addSpecial
Bram Moolenaar1e015462005-09-25 22:16:38 +0000798 endif
799
800 elseif last_line =~ '\S\+\s*),'.endline
801 call cursor(lnum, 1)
Bram Moolenaared32d942014-12-06 23:33:00 +0100802 call search('),'.endline, 'W')
Bram Moolenaar1e015462005-09-25 22:16:38 +0000803 let openedparent = searchpair('(', '', ')', 'bW', 'Skippmatch()')
804 if openedparent != lnum
805 let ind = indent(openedparent)
806 endif
Bram Moolenaare6ae6222013-05-21 21:01:10 +0200807
Bram Moolenaarc236c162008-07-13 17:41:49 +0000808 elseif last_line =~ '^\s*'.s:blockstart
Bram Moolenaarcbebd482016-02-07 23:02:56 +0100809 let ind = ind + s:sw()
Bram Moolenaar1e015462005-09-25 22:16:38 +0000810
Bram Moolenaarc236c162008-07-13 17:41:49 +0000811
Bram Moolenaared32d942014-12-06 23:33:00 +0100812 elseif AntepenultimateLine =~ '{'.endline || AntepenultimateLine =~ terminated || AntepenultimateLine =~# s:defaultORcase
Bram Moolenaarcbebd482016-02-07 23:02:56 +0100813 let ind = ind + s:sw()
Bram Moolenaar1e015462005-09-25 22:16:38 +0000814 endif
815
Bram Moolenaar1e015462005-09-25 22:16:38 +0000816 endif
817
Bram Moolenaare6ae6222013-05-21 21:01:10 +0200818 if cline =~ '^\s*[)\]];\='
Bram Moolenaarcbebd482016-02-07 23:02:56 +0100819 let ind = ind - s:sw()
Bram Moolenaar1e015462005-09-25 22:16:38 +0000820 endif
821
822 let b:PHP_CurrentIndentLevel = ind
Bram Moolenaare6ae6222013-05-21 21:01:10 +0200823 return ind + addSpecial
Bram Moolenaar9ff70112005-07-11 22:29:03 +0000824endfunction