@@ -26,11 +26,6 @@ setlocal indentkeys+=0],0)
2626let b: undo_indent = ' setlocal indentexpr< smartindent< autoindent< indentkeys<'
2727
2828" Regex of syntax group names that are or delimit string or are comments.
29- let b: syng_strcom = get (b: ,' syng_strcom' ,' string\|comment\|regex\|special\|doc\|template\%(braces\)\@!' )
30- let b: syng_str = get (b: ,' syng_str' ,' string\|template\|special' )
31- " template strings may want to be excluded when editing graphql:
32- " au! Filetype javascript let b:syng_str = '^\%(.*template\)\@!.*string\|special'
33- " au! Filetype javascript let b:syng_strcom = '^\%(.*template\)\@!.*string\|comment\|regex\|special\|doc'
3429
3530" Only define the function once.
3631if exists (' *GetJavascriptIndent' )
4035let s: cpo_save = &cpo
4136set cpo &vim
4237
38+ let s: syng_strcom = ' string\|comment\|regex\|special\|doc\|template\%(braces\)\@!'
39+ let s: syng_str = ' string\|template\|special'
40+ " template strings may want to be excluded when editing graphql:
41+ " au! Filetype javascript let b:syng_str = '^\%(.*template\)\@!.*string\|special'
42+ " au! Filetype javascript let b:syng_strcom = '^\%(.*template\)\@!.*string\|comment\|regex\|special\|doc'
43+ let s: js_cache = [0 ,0 ,0 ]
44+
45+ function s: GetVars ()
46+ for svar in [' syng_strcom' , ' syng_str' , ' js_cache' ]
47+ let b: {svar} = get (b: ,svar,copy (s: {svar}))
48+ endfor
49+ endfunction
50+
4351" Get shiftwidth value
4452if exists (' *shiftwidth' )
4553 function s: sw ()
@@ -159,19 +167,29 @@ function s:Token()
159167 return s: LookingAt () = ~ ' \k' ? expand (' <cword>' ) : s: LookingAt ()
160168endfunction
161169
162- function s: PreviousToken ()
163- let l: col = col (' .' )
170+ function s: PreviousToken (... )
171+ let [ l: pos , tok] = [ getpos (' .' ), ' ' ]
164172 if search (' \m\k\{1,}\|\S' ,' ebW' )
165- if search (' \m\*\%#\/\|\/\/\%<' .a: firstline .' l' ,' nbW' ,line (' .' )) && eval (s: in_comm )
166- if s: SearchLoop (' \S\ze\_s*\/[/*]' ,' bW' ,s: in_comm )
167- return s: Token ()
173+ if getline (' .' )[col (' .' )-2 : col (' .' )-1 ] == ' */'
174+ if eval (s: in_comm ) && ! s: SearchLoop (' \S\ze\_s*\/[/*]' ,' bW' ,s: in_comm )
175+ call setpos (' .' ,l: pos )
176+ else
177+ let tok = s: Token ()
168178 endif
169- call cursor (a: firstline , l: col )
170179 else
171- return s: Token ()
180+ let two = a: 0 || line (' .' ) != l: pos [1 ] ? strridx (getline (' .' )[: col (' .' )],' //' ) + 1 : 0
181+ if two && eval (s: in_comm )
182+ call cursor (0 ,two)
183+ let tok = s: PreviousToken (1 )
184+ if tok is ' '
185+ call setpos (' .' ,l: pos )
186+ endif
187+ else
188+ let tok = s: Token ()
189+ endif
172190 endif
173191 endif
174- return ' '
192+ return tok
175193endfunction
176194
177195function s: Pure (f ,... )
@@ -328,7 +346,7 @@ function s:IsBlock()
328346endfunction
329347
330348function GetJavascriptIndent ()
331- let b: js_cache = get ( b: , ' js_cache ' ,[ 0 , 0 , 0 ] )
349+ call s: GetVars ( )
332350 let s: synid_cache = [[],[]]
333351 let l: line = getline (v: lnum )
334352 " use synstack as it validates syn state and works in an empty line
0 commit comments