Skip to content

Commit 0f1f71f

Browse files
authored
PToken() optimize (#1070)
1 parent 3b21b5b commit 0f1f71f

File tree

1 file changed

+32
-14
lines changed

1 file changed

+32
-14
lines changed

indent/javascript.vim

Lines changed: 32 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -26,11 +26,6 @@ setlocal indentkeys+=0],0)
2626
let 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.
3631
if exists('*GetJavascriptIndent')
@@ -40,6 +35,19 @@ endif
4035
let s:cpo_save = &cpo
4136
set 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
4452
if exists('*shiftwidth')
4553
function s:sw()
@@ -159,19 +167,29 @@ function s:Token()
159167
return s:LookingAt() =~ '\k' ? expand('<cword>') : s:LookingAt()
160168
endfunction
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
175193
endfunction
176194

177195
function s:Pure(f,...)
@@ -328,7 +346,7 @@ function s:IsBlock()
328346
endfunction
329347

330348
function 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

Comments
 (0)