@@ -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