From 22b9f0f8e4be167d153b501775b2476e2e7d0d95 Mon Sep 17 00:00:00 2001 From: Chris Paul Date: Wed, 9 Nov 2016 12:13:36 -0800 Subject: [PATCH 001/435] consider regex when matching '/' (#703) * consider regex when matching '/' ``` i = /o/ { i(). n() } ``` * match == col || match == -1 * regex is code * list concat instead of string --- indent/javascript.vim | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/indent/javascript.vim b/indent/javascript.vim index b72ff920..44231e99 100644 --- a/indent/javascript.vim +++ b/indent/javascript.vim @@ -131,7 +131,7 @@ function s:IsBlock(...) let l:ln = get(a:000,0,line('.')) let char = s:previous_token() let syn = char =~ '[{>/]' || l:ln != line('.') ? synIDattr(synID(line('.'),col('.')-(char == '{'),0),'name') : '' - if char is '' + if char is '' || syn =~? 'regex' return 1 elseif syn =~? 'xml\|jsx' return char != '{' @@ -143,8 +143,8 @@ function s:IsBlock(...) return cursor(0,match(' ' . strpart(getline('.'),0,col('.')),'.*\zs' . s:case_stmt . '$')) + 1 && \ (expand('') !=# 'default' || s:previous_token() !~ '[,{]') endif - return index(split('return const let import export yield default delete var void typeof throw new in instanceof' - \ . ' - = ~ ! < * + , / ? ^ % | & ( ['), char) < (0 + (line('.') != l:ln)) + return index(split('return const let import export yield default delete var void typeof throw new in instanceof') + \ + split('-=~!<*+,/?^%|&([','\zs'), char) < (0 + (line('.') != l:ln)) endfunction " Find line above 'lnum' that isn't empty, in a comment, or in a string. @@ -154,7 +154,7 @@ function s:PrevCodeLine(lnum) let syn = synIDattr(synID(l:lnum,matchend(getline(l:lnum), '^\s*[^''"`]'),0),'name') if syn =~? 'html' return - elseif syn !~? s:syng_strcom + elseif syn !~? 'comment\|doc\|string\|template' return l:lnum endif let l:lnum = prevnonblank(l:lnum - 1) @@ -244,7 +244,8 @@ function GetJavascriptIndent() endif if stmt || !num - let isOp = l:line =~# s:opfirst || pline =~# s:continuation + let isOp = l:line =~# s:opfirst || pline =~# s:continuation && + \ synIDattr(synID(l:lnum,match(' ' . pline,'\/$'),0),'name') !~? 'regex' let bL = s:iscontOne(l:lnum,num,isOp) let bL -= (bL && l:line[0] == '{') * s:W endif From c938b83e290f83ef4a1d692625c45b3ba09957a0 Mon Sep 17 00:00:00 2001 From: Chris Paul Date: Wed, 9 Nov 2016 19:03:50 -0800 Subject: [PATCH 002/435] Update README.md (#702) --- CONTRIBUTING.md | 18 ------------------ README.md | 11 +++++------ 2 files changed, 5 insertions(+), 24 deletions(-) delete mode 100644 CONTRIBUTING.md diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md deleted file mode 100644 index c47cbc86..00000000 --- a/CONTRIBUTING.md +++ /dev/null @@ -1,18 +0,0 @@ -## Contributing - -This project uses the [git -flow](http://nvie.com/posts/a-successful-git-branching-model/) model for -development. There's [a handy git module for git -flow](//github.com/nvie/gitflow). If you'd like to be added as a contributor, -the price of admission is 1 pull request. Please follow the general code style -guides (read the code) and in your pull request explain the reason for the -proposed change and how it is valuable. - -## Pull Requests - -Please make your pull requests against the `develop` branch; we stage changes -for testing there to avoid unexpected breakages for our users. :) - -## Bug report - -Report a bug on [GitHub Issues](https://github.com/pangloss/vim-javascript/issues). diff --git a/README.md b/README.md index 1cd79f4c..a1137f79 100644 --- a/README.md +++ b/README.md @@ -103,13 +103,12 @@ variables: ## Contributing -This project uses the [git -flow](http://nvie.com/posts/a-successful-git-branching-model/) model for -development. There's [a handy git module for git -flow](//github.com/nvie/gitflow). If you'd like to be added as a contributor, -the price of admission is 1 pull request. Please follow the general code style +Please follow the general code style guides (read the code) and in your pull request explain the reason for the -proposed change and how it is valuable. +proposed change and how it is valuable. All p.r.'s will be reviewed by a +maintainer(s) then, hopefully, merged. + +Thank you! ## Bug Reports From bbabf9d67e0e45eee0e5e6c2fa377c457b96a08d Mon Sep 17 00:00:00 2001 From: Chris Paul Date: Sat, 12 Nov 2016 02:09:39 -0800 Subject: [PATCH 003/435] syntax aware previous token (#705) * syntax aware previous token Experimental at the moment * Replace logic from isBlock * remove asi special logic * no args * remove concat * remove lvl * clean reg * realign * strange regex 'haviour * date --- indent/javascript.vim | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/indent/javascript.vim b/indent/javascript.vim index 44231e99..25ce893d 100644 --- a/indent/javascript.vim +++ b/indent/javascript.vim @@ -2,7 +2,7 @@ " Language: Javascript " Maintainer: Chris Paul ( https://github.com/bounceme ) " URL: https://github.com/pangloss/vim-javascript -" Last Change: November 6, 2016 +" Last Change: November 12, 2016 " Only load this indent file when no other was loaded. if exists('b:did_indent') @@ -73,7 +73,13 @@ endfunction " NOTE: moves the cursor function s:previous_token() - return search('\<\|[][`^!"%-/:-?{-~]','bW') ? s:token() : '' + let l:ln = line('.') + return search('\<\|[][`^!"%-/:-?{-~]','bW') ? + \ (s:token() == '/' || line('.') != l:ln) && + \ synIDattr(synID(line('.'),col('.'),0),'name') =~? 'comment' ? + \ search('\/[/*]\&','bW') ? s:previous_token() : '' + \ : s:token() + \ : '' endfunction function s:Trim(ln) @@ -127,16 +133,14 @@ function s:iscontOne(i,num,cont) endfunction " https://github.com/sweet-js/sweet.js/wiki/design#give-lookbehind-to-the-reader -function s:IsBlock(...) - let l:ln = get(a:000,0,line('.')) +function s:IsBlock() + let l:ln = line('.') let char = s:previous_token() let syn = char =~ '[{>/]' || l:ln != line('.') ? synIDattr(synID(line('.'),col('.')-(char == '{'),0),'name') : '' if char is '' || syn =~? 'regex' return 1 elseif syn =~? 'xml\|jsx' return char != '{' - elseif syn =~? 'comment' - return search('\/[/*]','bW') && s:IsBlock(l:ln) elseif char == '>' return getline('.')[col('.')-2] == '=' || syn =~? '^jsflow' elseif char == ':' From f177220ebea04d777196f0478d484c58643e0ed4 Mon Sep 17 00:00:00 2001 From: Chris Paul Date: Sun, 13 Nov 2016 10:04:17 -0800 Subject: [PATCH 004/435] regex prettify --- indent/javascript.vim | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/indent/javascript.vim b/indent/javascript.vim index 25ce893d..c77734e5 100644 --- a/indent/javascript.vim +++ b/indent/javascript.vim @@ -84,10 +84,10 @@ endfunction function s:Trim(ln) let pline = substitute(getline(a:ln),'\s*$','','') - let l:max = max([strridx(pline,'//'),strridx(pline,'/*'),0]) + let l:max = max([match(pline,'.*\zs\/[/*]'),0]) while l:max && synIDattr(synID(a:ln, strlen(pline), 0), 'name') =~? 'comment\|doc' let pline = substitute(strpart(pline, 0, l:max),'\s*$','','') - let l:max = max([strridx(pline,'//'),strridx(pline,'/*'),0]) + let l:max = max([match(pline,'.*\zs\/[/*]'),0]) endwhile return pline endfunction From b3b85e34b744cffab67104cf455530d18a55f203 Mon Sep 17 00:00:00 2001 From: Chris Paul Date: Sun, 13 Nov 2016 14:50:53 -0800 Subject: [PATCH 005/435] trim from start of comment sequence (#709) * trim from start of comment sequence --- indent/javascript.vim | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/indent/javascript.vim b/indent/javascript.vim index c77734e5..a0048d4a 100644 --- a/indent/javascript.vim +++ b/indent/javascript.vim @@ -84,10 +84,10 @@ endfunction function s:Trim(ln) let pline = substitute(getline(a:ln),'\s*$','','') - let l:max = max([match(pline,'.*\zs\/[/*]'),0]) + let l:max = max([match(pline,'.*[^/]\zs\/[/*]'),0]) while l:max && synIDattr(synID(a:ln, strlen(pline), 0), 'name') =~? 'comment\|doc' let pline = substitute(strpart(pline, 0, l:max),'\s*$','','') - let l:max = max([match(pline,'.*\zs\/[/*]'),0]) + let l:max = max([match(pline,'.*[^/]\zs\/[/*]'),0]) endwhile return pline endfunction From 540d3a572d5ab922f0773a87044b044f0740d922 Mon Sep 17 00:00:00 2001 From: Chris Paul Date: Sun, 13 Nov 2016 21:30:48 -0800 Subject: [PATCH 006/435] improve regex for s:Trim (#710) --- indent/javascript.vim | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/indent/javascript.vim b/indent/javascript.vim index a0048d4a..2d49c982 100644 --- a/indent/javascript.vim +++ b/indent/javascript.vim @@ -84,10 +84,10 @@ endfunction function s:Trim(ln) let pline = substitute(getline(a:ln),'\s*$','','') - let l:max = max([match(pline,'.*[^/]\zs\/[/*]'),0]) + let l:max = max([match(pline,'.*\zs\%([^/]\zs\/\/\|\/\*\)'),0]) while l:max && synIDattr(synID(a:ln, strlen(pline), 0), 'name') =~? 'comment\|doc' let pline = substitute(strpart(pline, 0, l:max),'\s*$','','') - let l:max = max([match(pline,'.*[^/]\zs\/[/*]'),0]) + let l:max = max([match(pline,'.*\zs\%([^/]\zs\/\/\|\/\*\)'),0]) endwhile return pline endfunction From b8c62023da422199beaa9377960ebd373e51351c Mon Sep 17 00:00:00 2001 From: Chris Paul Date: Tue, 15 Nov 2016 19:08:21 -0800 Subject: [PATCH 007/435] add operators, regex experiment (#711) just adds typeof --- indent/javascript.vim | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/indent/javascript.vim b/indent/javascript.vim index 2d49c982..763b99ed 100644 --- a/indent/javascript.vim +++ b/indent/javascript.vim @@ -94,9 +94,9 @@ endfunction " configurable regexes that define continuation lines, not including (, {, or [. let s:opfirst = '^' . get(g:,'javascript_opfirst', - \ '\%([<>,?^%|*/&]\|\([-.:+]\)\1\@!\|=>\@!\|in\%(stanceof\)\=\>\)') + \ '\%([<>,?^%|*/&]\|\([-.:+]\)\1\@!\|=>\@!\|typeof\>\|in\%(stanceof\)\=\>\)') let s:continuation = get(g:,'javascript_continuation', - \ '\%([<=,.?/*^%|&:]\|+\@\|\\|\ Date: Wed, 16 Nov 2016 16:07:24 -0800 Subject: [PATCH 008/435] faster prevline (#713) is just as fast as before and also far quicker with a file like: https://raw.githubusercontent.com/sanctuary-js/sanctuary-def/master/index.js --- indent/javascript.vim | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/indent/javascript.vim b/indent/javascript.vim index 763b99ed..32ba1e65 100644 --- a/indent/javascript.vim +++ b/indent/javascript.vim @@ -153,15 +153,15 @@ endfunction " Find line above 'lnum' that isn't empty, in a comment, or in a string. function s:PrevCodeLine(lnum) - let l:lnum = prevnonblank(a:lnum) - while l:lnum - let syn = synIDattr(synID(l:lnum,matchend(getline(l:lnum), '^\s*[^''"`]'),0),'name') + let curp = [line('.'),col('.')] + call cursor(a:lnum+1,1) + while search('^\s*\%(\/\/\)\@!\S','bW') + let syn = synIDattr(synID(line('.'),matchend(getline('.'), '^\s*[^''"`]'),0),'name') if syn =~? 'html' return elseif syn !~? 'comment\|doc\|string\|template' - return l:lnum + return line('.') + call('cursor',curp) endif - let l:lnum = prevnonblank(l:lnum - 1) endwhile endfunction From f4245c4f794de2a923dd8ee634adc87352ef7748 Mon Sep 17 00:00:00 2001 From: Chris Paul Date: Wed, 16 Nov 2016 22:55:03 -0800 Subject: [PATCH 009/435] more correct comment match (#714) --- indent/javascript.vim | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/indent/javascript.vim b/indent/javascript.vim index 32ba1e65..b1c1fc79 100644 --- a/indent/javascript.vim +++ b/indent/javascript.vim @@ -192,7 +192,7 @@ function GetJavascriptIndent() if syns =~? 'comment\|doc' if l:line =~ '^\s*\*' return cindent(v:lnum) - elseif l:line !~ '^\s*\/' + elseif l:line !~ '^\s*\/[/*]' return -1 endif elseif syns =~? 'string\|template' && l:line !~ '^[''"]' From b18c6b88a687f5c1eb06ff1f559695ca15cf2d3a Mon Sep 17 00:00:00 2001 From: Amadeus Demarzi Date: Fri, 18 Nov 2016 14:38:09 -0800 Subject: [PATCH 010/435] Basic improvement to jsClassDefinition This improves things a bit to ensure that extends keyword can accept a jsExpression. I think this should work as everywhere as expected... Probably worth testing though. --- syntax/javascript.vim | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/syntax/javascript.vim b/syntax/javascript.vim index 22733c78..4d3341f8 100644 --- a/syntax/javascript.vim +++ b/syntax/javascript.vim @@ -175,10 +175,11 @@ exe 'syntax match jsFunction /\/ skipwhite skipempty nextgroup=jsGene exe 'syntax match jsArrowFunction /=>/ skipwhite skipempty nextgroup=jsFuncBlock,jsCommentFunction '.(exists('g:javascript_conceal_arrow_function') ? 'conceal cchar='.g:javascript_conceal_arrow_function : '') " Classes -syntax keyword jsClassKeywords contained extends class +syntax keyword jsClassKeyword contained class +syntax keyword jsExtendsKeyword contained extends skipwhite skipempty nextgroup=@jsExpression syntax match jsClassNoise contained /\./ syntax match jsClassMethodType contained /\%(get\|set\|static\|async\)\%( \k\+\)\@=/ skipwhite skipempty nextgroup=jsFuncName,jsClassProperty -syntax match jsClassDefinition /\\%( [a-zA-Z_$][0-9a-zA-Z_$ \n.]*\)*/ contains=jsClassKeywords,jsClassNoise skipwhite skipempty nextgroup=jsCommentClass,jsClassBlock,jsFlowClassGroup +syntax region jsClassDefinition start=/\/ end=/\(\\s\+\)\@\(\s*=\)\@=/ skipwhite skipempty nextgroup=jsClassValue syntax region jsClassValue contained start=/=/ end=/\%(;\|}\|\n\)\@=/ contains=@jsExpression syntax region jsClassPropertyComputed contained matchgroup=jsBrackets start=/\[/ end=/]/ contains=@jsExpression skipwhite skipempty nextgroup=jsFuncArgs,jsClassValue extend @@ -290,7 +291,8 @@ if version >= 508 || !exists("did_javascript_syn_inits") HiLink jsOperator Operator HiLink jsOf Operator HiLink jsStorageClass StorageClass - HiLink jsClassKeywords Keyword + HiLink jsClassKeyword Keyword + HiLink jsExtendsKeyword Keyword HiLink jsThis Special HiLink jsSuper Constant HiLink jsNan Number From 3efcf3111231c5737648c3eb9d4cea9320b98c70 Mon Sep 17 00:00:00 2001 From: Amadeus Demarzi Date: Fri, 18 Nov 2016 17:38:52 -0800 Subject: [PATCH 011/435] Adds jsSpreadExpression to jsBracket We were incorrectly not matching a spread in arrays. Whoops. Fixes #707 --- syntax/javascript.vim | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/syntax/javascript.vim b/syntax/javascript.vim index 4d3341f8..ddf34515 100644 --- a/syntax/javascript.vim +++ b/syntax/javascript.vim @@ -135,7 +135,7 @@ syntax keyword jsDomNodeConsts ELEMENT_NODE ATTRIBUTE_NODE TEXT_NODE CDATA_SECT syntax keyword jsHtmlEvents onblur onclick oncontextmenu ondblclick onfocus onkeydown onkeypress onkeyup onmousedown onmousemove onmouseout onmouseover onmouseup onresize " Code blocks -syntax region jsBracket matchgroup=jsBrackets start=/\[/ end=/\]/ contains=@jsExpression extend fold +syntax region jsBracket matchgroup=jsBrackets start=/\[/ end=/\]/ contains=@jsExpression,jsSpreadExpression extend fold syntax region jsParen matchgroup=jsParens start=/(/ end=/)/ contains=@jsAll extend fold syntax region jsParenDecorator contained matchgroup=jsParensDecorator start=/(/ end=/)/ contains=@jsAll skipwhite skipempty nextgroup=jsCommentMisc extend fold syntax region jsParenIfElse contained matchgroup=jsParensIfElse start=/(/ end=/)/ contains=@jsAll skipwhite skipempty nextgroup=jsCommentMisc,jsIfElseBlock extend fold From ae9324a61c5b5b82db38cefa0325a0b36b2d3dd6 Mon Sep 17 00:00:00 2001 From: Chris Paul Date: Fri, 18 Nov 2016 23:04:47 -0800 Subject: [PATCH 012/435] improve ptoken (#719) --- indent/javascript.vim | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/indent/javascript.vim b/indent/javascript.vim index b1c1fc79..ce8fb089 100644 --- a/indent/javascript.vim +++ b/indent/javascript.vim @@ -77,7 +77,7 @@ function s:previous_token() return search('\<\|[][`^!"%-/:-?{-~]','bW') ? \ (s:token() == '/' || line('.') != l:ln) && \ synIDattr(synID(line('.'),col('.'),0),'name') =~? 'comment' ? - \ search('\/[/*]\&','bW') ? s:previous_token() : '' + \ search('\%(\/\@ Date: Sun, 20 Nov 2016 11:21:37 -0800 Subject: [PATCH 013/435] remove dead code, rename function, date (#721) --- indent/javascript.vim | 25 +++++++++++-------------- 1 file changed, 11 insertions(+), 14 deletions(-) diff --git a/indent/javascript.vim b/indent/javascript.vim index ce8fb089..83aae3a2 100644 --- a/indent/javascript.vim +++ b/indent/javascript.vim @@ -2,7 +2,7 @@ " Language: Javascript " Maintainer: Chris Paul ( https://github.com/bounceme ) " URL: https://github.com/pangloss/vim-javascript -" Last Change: November 12, 2016 +" Last Change: November 20, 2016 " Only load this indent file when no other was loaded. if exists('b:did_indent') @@ -14,9 +14,8 @@ let b:did_indent = 1 setlocal indentexpr=GetJavascriptIndent() setlocal autoindent nolisp nosmartindent setlocal indentkeys=0{,0},0),0],:,!^F,o,O,e -setlocal cinoptions+=j1,J1 -let b:undo_indent = 'setlocal indentexpr< smartindent< autoindent< indentkeys< cinoptions<' +let b:undo_indent = 'setlocal indentexpr< smartindent< autoindent< indentkeys<' " Only define the function once. if exists('*GetJavascriptIndent') @@ -45,12 +44,12 @@ let s:syng_strcom = 'string\|comment\|regex\|special\|doc\|template' let s:skip_expr = "synIDattr(synID(line('.'),col('.'),0),'name') =~? '".s:syng_strcom."'" function s:skip_func(lnum) if !s:free || search('`\|\*\/','nW',a:lnum) - let s:free = !eval(s:skip_expr . " . '\\|html'") + let s:free = !eval(s:skip_expr) let s:looksyn = s:free ? line('.') : s:looksyn return !s:free endif let s:looksyn = line('.') - return (search('\/','nbW',s:looksyn) || search('[''"\\]','nW',s:looksyn)) && eval(s:skip_expr . " . '\\|html'") + return (search('\/','nbW',s:looksyn) || search('[''"\\]','nW',s:looksyn)) && eval(s:skip_expr) endfunction if has('reltime') @@ -63,12 +62,12 @@ else endfunction endif -function s:current_char() +function s:looking_at() return getline('.')[col('.')-1] endfunction function s:token() - return s:current_char() =~ '\k' ? expand('') : s:current_char() + return s:looking_at() =~ '\k' ? expand('') : s:looking_at() endfunction " NOTE: moves the cursor @@ -156,10 +155,8 @@ function s:PrevCodeLine(lnum) let curp = [line('.'),col('.')] call cursor(a:lnum+1,1) while search('^\s*\%(\/\/\)\@!\S','bW') - let syn = synIDattr(synID(line('.'),matchend(getline('.'), '^\s*[^''"`]'),0),'name') - if syn =~? 'html' - return - elseif syn !~? 'comment\|doc\|string\|template' + if synIDattr(synID(line('.'),matchend(getline('.'), '^\s*[^''"`]'),0),'name') !~? + \ 'comment\|doc\|string\|template' return line('.') + call('cursor',curp) endif endwhile @@ -225,7 +222,7 @@ function GetJavascriptIndent() endif if idx + 1 - if idx == 2 && search('\S','bW',line('.')) && s:current_char() == ')' + if idx == 2 && search('\S','bW',line('.')) && s:looking_at() == ')' call s:GetPair('(',')','bW',s:skip_expr,200) endif return indent(line('.')) @@ -235,9 +232,9 @@ function GetJavascriptIndent() let num = b:js_cache[1] let [s:W, pline, isOp, stmt, bL, switch_offset] = [s:sw(), s:Trim(l:lnum),0,0,0,0] - if num && s:current_char() == '{' && s:IsBlock() + if num && s:looking_at() == '{' && s:IsBlock() let stmt = 1 - if s:current_char() == ')' && s:GetPair('(', ')', 'bW', s:skip_expr, 100) > 0 && s:previous_token() ==# 'switch' + if s:looking_at() == ')' && s:GetPair('(', ')', 'bW', s:skip_expr, 100) > 0 && s:previous_token() ==# 'switch' let switch_offset = &cino !~ ':' || !has('float') ? s:W : \ float2nr(str2float(matchstr(&cino,'.*:\zs[-0-9.]*')) * (&cino =~# '\%(.*:\)\@>[^,]*s' ? s:W : 1)) if l:line =~# '^' . s:case_stmt From a87c94438b038a060fa2920055a50a0c1cf08186 Mon Sep 17 00:00:00 2001 From: Chris Paul Date: Sun, 20 Nov 2016 12:24:31 -0800 Subject: [PATCH 014/435] unneeded token call (#722) --- indent/javascript.vim | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/indent/javascript.vim b/indent/javascript.vim index 83aae3a2..35f047a3 100644 --- a/indent/javascript.vim +++ b/indent/javascript.vim @@ -74,7 +74,7 @@ endfunction function s:previous_token() let l:ln = line('.') return search('\<\|[][`^!"%-/:-?{-~]','bW') ? - \ (s:token() == '/' || line('.') != l:ln) && + \ (s:looking_at() == '/' || line('.') != l:ln) && \ synIDattr(synID(line('.'),col('.'),0),'name') =~? 'comment' ? \ search('\%(\/\@ Date: Thu, 24 Nov 2016 10:08:01 -0800 Subject: [PATCH 015/435] paren start line as baseline in blocks (#725) --- indent/javascript.vim | 22 +++++++++++++--------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/indent/javascript.vim b/indent/javascript.vim index 35f047a3..57972bc6 100644 --- a/indent/javascript.vim +++ b/indent/javascript.vim @@ -2,7 +2,7 @@ " Language: Javascript " Maintainer: Chris Paul ( https://github.com/bounceme ) " URL: https://github.com/pangloss/vim-javascript -" Last Change: November 20, 2016 +" Last Change: November 24, 2016 " Only load this indent file when no other was loaded. if exists('b:did_indent') @@ -93,7 +93,7 @@ endfunction " configurable regexes that define continuation lines, not including (, {, or [. let s:opfirst = '^' . get(g:,'javascript_opfirst', - \ '\%([<>,?^%|*/&]\|\([-.:+]\)\1\@!\|=>\@!\|typeof\>\|in\%(stanceof\)\=\>\)') + \ '\%([<>,?^%|*/&]\|\([-.:+]\)\1\@!\|!=\|=>\@!\|typeof\>\|in\%(stanceof\)\=\>\)') let s:continuation = get(g:,'javascript_continuation', \ '\%([<=,.?/*^%|&:]\|+\@\|\ 0 && s:previous_token() ==# 'switch' - let switch_offset = &cino !~ ':' || !has('float') ? s:W : - \ float2nr(str2float(matchstr(&cino,'.*:\zs[-0-9.]*')) * (&cino =~# '\%(.*:\)\@>[^,]*s' ? s:W : 1)) - if l:line =~# '^' . s:case_stmt - return indent(num) + switch_offset + if s:looking_at() == ')' && s:GetPair('(', ')', 'bW', s:skip_expr, 100) > 0 + let num = line('.') + if s:previous_token() ==# 'switch' + let switch_offset = &cino !~ ':' || !has('float') ? s:W : + \ float2nr(str2float(matchstr(&cino,'.*:\zs[-0-9.]*')) * (&cino =~# '\%(.*:\)\@>[^,]*s' ? s:W : 1)) + if l:line =~# '^' . s:case_stmt + return indent(num) + switch_offset + elseif pline =~# s:case_stmt . '$' + return indent(l:lnum) + s:W + endif endif - let stmt = pline !~# s:case_stmt . '$' endif + let stmt = 1 endif if stmt || !num From 91b0a0da0c2b1af1af168e5149cdc9a6eb99a190 Mon Sep 17 00:00:00 2001 From: Amadeus Demarzi Date: Thu, 24 Nov 2016 12:18:27 -0800 Subject: [PATCH 016/435] Fix end pattern for import region There was a bug where import regions required a semicolon, no longer. This fixes issue #726 --- syntax/javascript.vim | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/syntax/javascript.vim b/syntax/javascript.vim index ddf34515..fad38627 100644 --- a/syntax/javascript.vim +++ b/syntax/javascript.vim @@ -44,7 +44,7 @@ syntax keyword jsModuleOperators contained as syntax region jsModuleGroup contained matchgroup=jsModuleBraces start=/{/ end=/}/ contains=jsModuleOperators,jsNoise,jsComment syntax match jsModuleAsterisk contained /*/ syntax keyword jsModuleDefault contained default skipwhite skipempty nextgroup=@jsExpression -syntax region jsImportContainer start=/\ / end="\%(;\|$\)" contains=jsModuleKeywords,jsModuleOperators,jsComment,jsString,jsTemplateString,jsNoise,jsModuleGroup,jsModuleAsterisk +syntax region jsImportContainer start=/\/ end=/\%("\|'\s*\)\@<=\%(;\|\n\)/ contains=jsModuleKeywords,jsModuleOperators,jsComment,jsString,jsTemplateString,jsNoise,jsModuleGroup,jsModuleAsterisk keepend syntax region jsExportContainer start=/\ / end="\%(;\|$\)" contains=jsModuleKeywords,jsModuleOperators,jsStorageClass,jsModuleDefault,@jsExpression syntax region jsExportBlock contained matchgroup=jsExportBraces start=/{/ end=/}/ contains=jsModuleOperators,jsNoise,jsComment From 3873adbff5f1b626130bb7f1dad8b62b1aec1b7f Mon Sep 17 00:00:00 2001 From: Amadeus Demarzi Date: Fri, 25 Nov 2016 11:17:38 -0800 Subject: [PATCH 017/435] Completely refactored how import/export work I've never liked how I originally built import/export. This refactors everything keeping the logic simpler and also share matches between them. Using regions I think was a mistake on my part, I've opted instead to use nextgroups which works much better. --- syntax/javascript.vim | 33 +++++++++++++++++---------------- 1 file changed, 17 insertions(+), 16 deletions(-) diff --git a/syntax/javascript.vim b/syntax/javascript.vim index fad38627..bbe6ff98 100644 --- a/syntax/javascript.vim +++ b/syntax/javascript.vim @@ -37,16 +37,14 @@ syntax keyword jsBooleanTrue true syntax keyword jsBooleanFalse false " Modules -syntax keyword jsModuleKeywords contained import -syntax keyword jsModuleKeywords contained export skipwhite skipempty nextgroup=jsExportBlock,jsModuleDefault -syntax keyword jsModuleOperators contained from -syntax keyword jsModuleOperators contained as -syntax region jsModuleGroup contained matchgroup=jsModuleBraces start=/{/ end=/}/ contains=jsModuleOperators,jsNoise,jsComment -syntax match jsModuleAsterisk contained /*/ -syntax keyword jsModuleDefault contained default skipwhite skipempty nextgroup=@jsExpression -syntax region jsImportContainer start=/\/ end=/\%("\|'\s*\)\@<=\%(;\|\n\)/ contains=jsModuleKeywords,jsModuleOperators,jsComment,jsString,jsTemplateString,jsNoise,jsModuleGroup,jsModuleAsterisk keepend -syntax region jsExportContainer start=/\ / end="\%(;\|$\)" contains=jsModuleKeywords,jsModuleOperators,jsStorageClass,jsModuleDefault,@jsExpression -syntax region jsExportBlock contained matchgroup=jsExportBraces start=/{/ end=/}/ contains=jsModuleOperators,jsNoise,jsComment +syntax keyword jsImport import skipwhite skipempty nextgroup=jsModuleAsterisk,jsModuleKeyword,jsModuleGroup +syntax keyword jsExport export skipwhite skipempty nextgroup=@jsAll,jsModuleGroup,jsExportDefault,jsModuleAsterisk,jsModuleKeyword +syntax match jsModuleKeyword contained /\k\+/ skipwhite skipempty nextgroup=jsModuleAs,jsFrom,jsModuleComma +syntax keyword jsExportDefault contained default skipwhite skipempty nextgroup=@jsExpression +syntax match jsModuleAsterisk contained /\*/ skipwhite skipempty nextgroup=jsModuleKeyword,jsModuleAs,jsFrom +syntax keyword jsModuleAs contained as skipwhite skipempty nextgroup=jsModuleKeyword +syntax keyword jsFrom contained from skipwhite skipempty nextgroup=jsString +syntax match jsModuleComma contained /,/ skipwhite skipempty nextgroup=jsModuleKeyword,jsModuleAsterisk,jsModuleGroup " Strings, Templates, Numbers syntax region jsString start=+"+ skip=+\\\("\|$\)+ end=+"\|$+ contains=jsSpecial,@Spell extend @@ -154,6 +152,7 @@ syntax region jsRepeatBlock contained matchgroup=jsRepeatBraces s syntax region jsDestructuringBlock contained matchgroup=jsDestructuringBraces start=/{/ end=/}/ contains=jsDestructuringProperty,jsDestructuringAssignment,jsDestructuringNoise,jsDestructuringPropertyComputed,jsSpreadExpression extend fold syntax region jsDestructuringArray contained matchgroup=jsDestructuringBraces start=/\[/ end=/\]/ contains=jsDestructuringPropertyValue,jsNoise,jsDestructuringProperty,jsSpreadExpression extend fold syntax region jsObject matchgroup=jsObjectBraces start=/{/ end=/}/ contains=jsObjectKey,jsObjectKeyString,jsObjectKeyComputed,jsObjectSeparator,jsObjectFuncName,jsObjectMethodType,jsGenerator,jsComment,jsObjectStringKey,jsSpreadExpression,jsDecorator extend fold +syntax region jsModuleGroup contained matchgroup=jsModuleBraces start=/{/ end=/}/ contains=jsModuleKeyword,jsModuleComma,jsModuleAs,jsComment skipwhite skipempty nextgroup=jsFrom syntax region jsTernaryIf matchgroup=jsTernaryIfOperator start=/?/ end=/\%(:\|[\}]\@=\)/ contains=@jsExpression syntax region jsSpreadExpression contained matchgroup=jsSpreadOperator start=/\.\.\./ end=/[,}\]]\@=/ contains=@jsExpression syntax region jsRestExpression contained matchgroup=jsRestOperator start=/\.\.\./ end=/[,)]\@=/ @@ -229,7 +228,7 @@ if exists("javascript_plugin_flow") endif syntax cluster jsExpression contains=jsBracket,jsParen,jsObject,jsBlock,jsTernaryIf,jsTaggedTemplate,jsTemplateString,jsString,jsRegexpString,jsNumber,jsFloat,jsOperator,jsBooleanTrue,jsBooleanFalse,jsNull,jsFunction,jsArrowFunction,jsGlobalObjects,jsExceptions,jsFutureKeys,jsDomErrNo,jsDomNodeConsts,jsHtmlEvents,jsFuncCall,jsUndefined,jsNan,jsPrototype,jsBuiltins,jsNoise,jsClassDefinition,jsArrowFunction,jsArrowFuncArgs,jsParensError,jsComment,jsArguments,jsThis,jsSuper,jsDo -syntax cluster jsAll contains=@jsExpression,jsExportContainer,jsImportContainer,jsStorageClass,jsConditional,jsRepeat,jsReturn,jsStatement,jsException,jsTry,jsAsyncKeyword +syntax cluster jsAll contains=@jsExpression,jsStorageClass,jsConditional,jsRepeat,jsReturn,jsStatement,jsException,jsTry,jsAsyncKeyword " Define the default highlighting. " For version 5.7 and earlier: only when not done already @@ -319,7 +318,6 @@ if version >= 508 || !exists("did_javascript_syn_inits") HiLink jsFinallyBraces jsBraces HiLink jsRepeatBraces jsBraces HiLink jsSwitchBraces jsBraces - HiLink jsExportBraces jsBraces HiLink jsSpecial Special HiLink jsTemplateVar Special HiLink jsTemplateBraces jsBraces @@ -327,14 +325,17 @@ if version >= 508 || !exists("did_javascript_syn_inits") HiLink jsGlobalNodeObjects Constant HiLink jsExceptions Constant HiLink jsBuiltins Constant - HiLink jsModuleKeywords Include - HiLink jsModuleOperators Include - HiLink jsModuleDefault Include + HiLink jsImport Include + HiLink jsExport Include + HiLink jsExportDefault Include + HiLink jsModuleAs Include + HiLink jsModuleComma jsNoise + HiLink jsModuleAsterisk Noise + HiLink jsFrom Include HiLink jsDecorator Special HiLink jsDecoratorFunction Function HiLink jsParensDecorator jsParens HiLink jsFuncArgOperator jsFuncArgs - HiLink jsModuleAsterisk Noise HiLink jsClassProperty jsObjectKey HiLink jsSpreadOperator Operator HiLink jsRestOperator Operator From 66f120cb0cb87977e7275aa49b6e1a73405a3549 Mon Sep 17 00:00:00 2001 From: Amadeus Demarzi Date: Fri, 25 Nov 2016 11:30:17 -0800 Subject: [PATCH 018/435] Improve default handling `default` is more like a StorageClass, so I've opted to highlight it more appropriately. Also make it highlight properly within `jsModuleGroup` as well. --- syntax/javascript.vim | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/syntax/javascript.vim b/syntax/javascript.vim index bbe6ff98..a526c4cf 100644 --- a/syntax/javascript.vim +++ b/syntax/javascript.vim @@ -37,14 +37,15 @@ syntax keyword jsBooleanTrue true syntax keyword jsBooleanFalse false " Modules -syntax keyword jsImport import skipwhite skipempty nextgroup=jsModuleAsterisk,jsModuleKeyword,jsModuleGroup -syntax keyword jsExport export skipwhite skipempty nextgroup=@jsAll,jsModuleGroup,jsExportDefault,jsModuleAsterisk,jsModuleKeyword -syntax match jsModuleKeyword contained /\k\+/ skipwhite skipempty nextgroup=jsModuleAs,jsFrom,jsModuleComma -syntax keyword jsExportDefault contained default skipwhite skipempty nextgroup=@jsExpression -syntax match jsModuleAsterisk contained /\*/ skipwhite skipempty nextgroup=jsModuleKeyword,jsModuleAs,jsFrom -syntax keyword jsModuleAs contained as skipwhite skipempty nextgroup=jsModuleKeyword -syntax keyword jsFrom contained from skipwhite skipempty nextgroup=jsString -syntax match jsModuleComma contained /,/ skipwhite skipempty nextgroup=jsModuleKeyword,jsModuleAsterisk,jsModuleGroup +syntax keyword jsImport import skipwhite skipempty nextgroup=jsModuleAsterisk,jsModuleKeyword,jsModuleGroup +syntax keyword jsExport export skipwhite skipempty nextgroup=@jsAll,jsModuleGroup,jsExportDefault,jsModuleAsterisk,jsModuleKeyword +syntax match jsModuleKeyword contained /\k\+/ skipwhite skipempty nextgroup=jsModuleAs,jsFrom,jsModuleComma +syntax keyword jsExportDefault contained default skipwhite skipempty nextgroup=@jsExpression +syntax keyword jsExportDefaultGroup contained default skipwhite skipempty nextgroup=jsModuleAs,jsFrom,jsModuleComma +syntax match jsModuleAsterisk contained /\*/ skipwhite skipempty nextgroup=jsModuleKeyword,jsModuleAs,jsFrom +syntax keyword jsModuleAs contained as skipwhite skipempty nextgroup=jsModuleKeyword,jsExportDefaultGroup +syntax keyword jsFrom contained from skipwhite skipempty nextgroup=jsString +syntax match jsModuleComma contained /,/ skipwhite skipempty nextgroup=jsModuleKeyword,jsModuleAsterisk,jsModuleGroup " Strings, Templates, Numbers syntax region jsString start=+"+ skip=+\\\("\|$\)+ end=+"\|$+ contains=jsSpecial,@Spell extend @@ -327,7 +328,8 @@ if version >= 508 || !exists("did_javascript_syn_inits") HiLink jsBuiltins Constant HiLink jsImport Include HiLink jsExport Include - HiLink jsExportDefault Include + HiLink jsExportDefault StorageClass + HiLink jsExportDefaultGroup jsExportDefault HiLink jsModuleAs Include HiLink jsModuleComma jsNoise HiLink jsModuleAsterisk Noise From 1801887f2e39c984d861368f3e0ea51b8555b0d2 Mon Sep 17 00:00:00 2001 From: Chris Paul Date: Fri, 25 Nov 2016 17:56:22 -0800 Subject: [PATCH 019/435] operator cleaning (#729) --- indent/javascript.vim | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/indent/javascript.vim b/indent/javascript.vim index 57972bc6..a261169b 100644 --- a/indent/javascript.vim +++ b/indent/javascript.vim @@ -93,9 +93,9 @@ endfunction " configurable regexes that define continuation lines, not including (, {, or [. let s:opfirst = '^' . get(g:,'javascript_opfirst', - \ '\%([<>,?^%|*/&]\|\([-.:+]\)\1\@!\|!=\|=>\@!\|typeof\>\|in\%(stanceof\)\=\>\)') + \ '\%([<>=,?^%|*/&]\|\([-.:+]\)\1\@!\|!=\|in\%(stanceof\)\=\>\)') let s:continuation = get(g:,'javascript_continuation', - \ '\%([<=,.?/*^%|&:]\|+\@\|\\|\<\%(typeof\|delete\|void\|in\|instanceof\)\)') . '$' function s:OneScope(lnum,text) if cursor(a:lnum, match(' ' . a:text, ')$')) + 1 && From 8265877f70452d0a8c09255c52f4ac0d9fb145e0 Mon Sep 17 00:00:00 2001 From: Chris Paul Date: Fri, 25 Nov 2016 21:25:06 -0800 Subject: [PATCH 020/435] indentkeys (#732) add values to indentkeys rather than replace user's --- README.md | 1 + indent/javascript.vim | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index a1137f79..23ec94af 100644 --- a/README.md +++ b/README.md @@ -100,6 +100,7 @@ variables: ## Indentation Specific * `:h cino-:` +* `:h 'indentkeys'` ## Contributing diff --git a/indent/javascript.vim b/indent/javascript.vim index a261169b..3da887e0 100644 --- a/indent/javascript.vim +++ b/indent/javascript.vim @@ -13,7 +13,7 @@ let b:did_indent = 1 " Now, set up our indentation expression and keys that trigger it. setlocal indentexpr=GetJavascriptIndent() setlocal autoindent nolisp nosmartindent -setlocal indentkeys=0{,0},0),0],:,!^F,o,O,e +setlocal indentkeys+=0],0) let b:undo_indent = 'setlocal indentexpr< smartindent< autoindent< indentkeys<' From 18ff935c9c126e14fd62e0df8e688fc54598e867 Mon Sep 17 00:00:00 2001 From: Chris Paul Date: Sat, 26 Nov 2016 01:13:52 -0800 Subject: [PATCH 021/435] optimization: no continuation at block start (#733) --- indent/javascript.vim | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/indent/javascript.vim b/indent/javascript.vim index 3da887e0..86a814cf 100644 --- a/indent/javascript.vim +++ b/indent/javascript.vim @@ -248,7 +248,7 @@ function GetJavascriptIndent() let stmt = 1 endif - if stmt || !num + if stmt && pline[-1:] != '{' || !num let isOp = l:line =~# s:opfirst || pline =~# s:continuation && \ synIDattr(synID(l:lnum,match(' ' . pline,'\/$'),0),'name') !~? 'regex' let bL = s:iscontOne(l:lnum,num,isOp) From 3dd27d6316c6031c2a7e6ae0a69ace683e2b431b Mon Sep 17 00:00:00 2001 From: Amadeus Demarzi Date: Sat, 26 Nov 2016 12:14:17 -0800 Subject: [PATCH 022/435] Adding support for Flow type imports --- extras/flow.vim | 1 + syntax/javascript.vim | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/extras/flow.vim b/extras/flow.vim index 028ea3fc..b181e0e1 100644 --- a/extras/flow.vim +++ b/extras/flow.vim @@ -13,6 +13,7 @@ syntax match jsFlowArrow contained /=>/ skipwhite skipempty nextgroup syntax match jsFlowMaybe contained /?/ skipwhite skipempty nextgroup=jsFlowType,jsFlowTypeCustom,jsFlowParens,jsFlowArrowArguments syntax match jsFlowObjectKey contained /[0-9a-zA-Z_$?]*\(\s*:\)\@=/ contains=jsFunctionKey,jsFlowMaybe skipwhite skipempty nextgroup=jsObjectValue containedin=jsObject syntax match jsFlowOrOperator contained /|/ skipwhite skipempty nextgroup=@jsFlowCluster +syntax keyword jsFlowImportType contained type skipwhite skipempty nextgroup=jsModuleAsterisk,jsModuleKeyword,jsModuleGroup syntax match jsFlowReturn contained /:\s*/ contains=jsFlowNoise skipwhite skipempty nextgroup=@jsFlowReturnCluster syntax region jsFlowReturnObject contained matchgroup=jsFlowNoise start=/{/ end=/}/ contains=@jsFlowCluster skipwhite skipempty nextgroup=jsFuncBlock,jsFlowReturnOrOp diff --git a/syntax/javascript.vim b/syntax/javascript.vim index a526c4cf..478b4b46 100644 --- a/syntax/javascript.vim +++ b/syntax/javascript.vim @@ -37,7 +37,7 @@ syntax keyword jsBooleanTrue true syntax keyword jsBooleanFalse false " Modules -syntax keyword jsImport import skipwhite skipempty nextgroup=jsModuleAsterisk,jsModuleKeyword,jsModuleGroup +syntax keyword jsImport import skipwhite skipempty nextgroup=jsModuleAsterisk,jsModuleKeyword,jsModuleGroup,jsFlowImportType syntax keyword jsExport export skipwhite skipempty nextgroup=@jsAll,jsModuleGroup,jsExportDefault,jsModuleAsterisk,jsModuleKeyword syntax match jsModuleKeyword contained /\k\+/ skipwhite skipempty nextgroup=jsModuleAs,jsFrom,jsModuleComma syntax keyword jsExportDefault contained default skipwhite skipempty nextgroup=@jsExpression From 25ceb55782cab1c83089e399b8c683fbee1fdfd2 Mon Sep 17 00:00:00 2001 From: Chris Paul Date: Sun, 27 Nov 2016 13:02:23 -0800 Subject: [PATCH 023/435] cleaning, Rework prevcodeline() (#736) --- indent/javascript.vim | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) diff --git a/indent/javascript.vim b/indent/javascript.vim index 86a814cf..62b9f453 100644 --- a/indent/javascript.vim +++ b/indent/javascript.vim @@ -150,16 +150,14 @@ function s:IsBlock() \ + split('-=~!<*+,/?^%|&([','\zs'), char) < (0 + (line('.') != l:ln)) endfunction -" Find line above 'lnum' that isn't empty, in a comment, or in a string. +" Find line above 'lnum' that isn't empty or in a comment function s:PrevCodeLine(lnum) - let curp = [line('.'),col('.')] - call cursor(a:lnum+1,1) - while search('^\s*\%(\/\/\)\@!\S','bW') - if synIDattr(synID(line('.'),matchend(getline('.'), '^\s*[^''"`]'),0),'name') !~? - \ 'comment\|doc\|string\|template' - return line('.') + call('cursor',curp) - endif + let l:n = prevnonblank(a:lnum) + while getline(l:n) =~ '^\s*\/[/*]' || synIDattr(synID(l:n,1,0),'name') =~? + \ 'comment\|doc' + let l:n = prevnonblank(l:n-1) endwhile + return l:n endfunction " Check if line 'lnum' has a balanced amount of parentheses. @@ -225,10 +223,10 @@ function GetJavascriptIndent() if idx == 2 && search('\S','bW',line('.')) && s:looking_at() == ')' call s:GetPair('(',')','bW',s:skip_expr,200) endif - return indent(line('.')) + return indent('.') endif - let b:js_cache = [v:lnum] + (line('.') == v:lnum ? [0,0] : [line('.'),col('.')]) + let b:js_cache = [v:lnum] + (line('.') == v:lnum ? [0,0] : getpos('.')[1:2]) let num = b:js_cache[1] let [s:W, pline, isOp, stmt, bL, switch_offset] = [s:sw(), s:Trim(l:lnum),0,0,0,0] From c1d4b3b0726164df803dc4c8a249ca3b4bee7e54 Mon Sep 17 00:00:00 2001 From: Chris Paul Date: Mon, 28 Nov 2016 22:01:53 -0800 Subject: [PATCH 024/435] keywords used as props (#737) --- indent/javascript.vim | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/indent/javascript.vim b/indent/javascript.vim index 62b9f453..36cf7add 100644 --- a/indent/javascript.vim +++ b/indent/javascript.vim @@ -36,7 +36,7 @@ else endfunction endif -let s:case_stmt = '\<\%(case\>\s*[^ \t:].*\|default\s*\):\C' +let s:case_stmt = '\<\%(case\>\s*[^ \t:].*\|\%(\.\s*\)\@=,?^%|*/&]\|\([-.:+]\)\1\@!\|!=\|in\%(stanceof\)\=\>\)') let s:continuation = get(g:,'javascript_continuation', - \ '\%([<=,.~!?/*^%|&:]\|+\@\|\<\%(typeof\|delete\|void\|in\|instanceof\)\)') . '$' + \ '\%([<=,.~!?/*^%|&:]\|+\@\|\%(\.\s*\)\@\)$\C')) + 1 + return cursor(a:lnum, match(' ' . a:text, '\%(\%(\.\s*\)\@\)$\C')) + 1 endfunction function s:iscontOne(i,num,cont) From 1bc94813713b782de5d020b6c947a931fe7faa63 Mon Sep 17 00:00:00 2001 From: Chris Paul Date: Tue, 29 Nov 2016 01:24:27 -0800 Subject: [PATCH 025/435] date, minor regex --- indent/javascript.vim | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/indent/javascript.vim b/indent/javascript.vim index 36cf7add..754e5a79 100644 --- a/indent/javascript.vim +++ b/indent/javascript.vim @@ -2,7 +2,7 @@ " Language: Javascript " Maintainer: Chris Paul ( https://github.com/bounceme ) " URL: https://github.com/pangloss/vim-javascript -" Last Change: November 24, 2016 +" Last Change: November 29, 2016 " Only load this indent file when no other was loaded. if exists('b:did_indent') @@ -36,7 +36,7 @@ else endfunction endif -let s:case_stmt = '\<\%(case\>\s*[^ \t:].*\|\%(\.\s*\)\@\s*[^ \t:].*\|default\s*\):\C' " Regex of syntax group names that are or delimit string or are comments. let s:syng_strcom = 'string\|comment\|regex\|special\|doc\|template' From 982f699defd96d94566c4184d2f04c8d014bdcb9 Mon Sep 17 00:00:00 2001 From: Chris Paul Date: Wed, 30 Nov 2016 12:05:31 -0800 Subject: [PATCH 026/435] small optimization (#738) * small optimization removes a syntax check unless possible comment * refactor isBlock for keywords makes isBlock more accurate * cleaning * cursor() is 0 for success --- indent/javascript.vim | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/indent/javascript.vim b/indent/javascript.vim index 754e5a79..672158d6 100644 --- a/indent/javascript.vim +++ b/indent/javascript.vim @@ -74,7 +74,7 @@ endfunction function s:previous_token() let l:ln = line('.') return search('\<\|[][`^!"%-/:-?{-~]','bW') ? - \ (s:looking_at() == '/' || line('.') != l:ln) && + \ (s:looking_at() == '/' || line('.') != l:ln && getline('.') =~ '\/\/') && \ synIDattr(synID(line('.'),col('.'),0),'name') =~? 'comment' ? \ search('\%(\/\@\|\%(\.\s*\)\@ 0 let token = s:previous_token() if index(split('await each'),token) + 1 @@ -106,7 +106,7 @@ function s:OneScope(lnum,text) endif return index(split('for if let while with'),token) + 1 endif - return cursor(a:lnum, match(' ' . a:text, '\%(\%(\.\s*\)\@\)$\C')) + 1 + return !cursor(a:lnum, match(' ' . a:text, '\%(\%(\.\s*\)\@\)$\C')) endfunction function s:iscontOne(i,num,cont) @@ -140,14 +140,16 @@ function s:IsBlock() return 1 elseif syn =~? 'xml\|jsx' return char != '{' + elseif char =~ '\k' + return index(split('return const let import export yield default delete var void typeof throw new in instanceof') + \ ,char) < (0 + (line('.') != l:ln)) || s:previous_token() == '.' elseif char == '>' return getline('.')[col('.')-2] == '=' || syn =~? '^jsflow' elseif char == ':' - return cursor(0,match(' ' . strpart(getline('.'),0,col('.')),'.*\zs' . s:case_stmt . '$')) + 1 && + return !cursor(0,match(' ' . strpart(getline('.'),0,col('.')),'.*\zs' . s:case_stmt . '$')) && \ (expand('') !=# 'default' || s:previous_token() !~ '[,{]') endif - return index(split('return const let import export yield default delete var void typeof throw new in instanceof') - \ + split('-=~!<*+,/?^%|&([','\zs'), char) < (0 + (line('.') != l:ln)) + return char !~ '[-=~!<*+,/?^%|&([]' endfunction " Find line above 'lnum' that isn't empty or in a comment From 7ceb23304343759608ddfc5aca74f4f892cf4619 Mon Sep 17 00:00:00 2001 From: Chris Paul Date: Wed, 30 Nov 2016 23:53:54 -0800 Subject: [PATCH 027/435] misc indent changes (#739) * misc indent changes * more refactor (#740) --- indent/javascript.vim | 36 ++++++++++++++++-------------------- 1 file changed, 16 insertions(+), 20 deletions(-) diff --git a/indent/javascript.vim b/indent/javascript.vim index 672158d6..1bdd6ab4 100644 --- a/indent/javascript.vim +++ b/indent/javascript.vim @@ -73,7 +73,7 @@ endfunction " NOTE: moves the cursor function s:previous_token() let l:ln = line('.') - return search('\<\|[][`^!"%-/:-?{-~]','bW') ? + return search('.\>\|[][`^!"%-/:-?{-~]','bW') ? \ (s:looking_at() == '/' || line('.') != l:ln && getline('.') =~ '\/\/') && \ synIDattr(synID(line('.'),col('.'),0),'name') =~? 'comment' ? \ search('\%(\/\@=,?^%|*/&]\|\([-.:+]\)\1\@!\|!=\|in\%(stanceof\)\=\>\)') let s:continuation = get(g:,'javascript_continuation', \ '\%([<=,.~!?/*^%|&:]\|+\@\|\%(\.\s*\)\@ 0 +" get the line (or if empty, look further back) of code stripped of comments +function s:Trim(lnum,...) + let p = a:0 ? [0,0] : getpos('.')[1:2] + let r = !cursor(a:lnum+1,1) && s:previous_token() isnot '' ? strpart(getline('.'),0,col('.')) : '' + call call('cursor',p) + return r +endfunction + +function s:OneScope(lnum) + let pline = s:Trim(a:lnum,1) + if pline[-1:] == ')' && s:GetPair('(', ')', 'bW', s:skip_expr, 100) > 0 let token = s:previous_token() if index(split('await each'),token) + 1 return s:previous_token() ==# 'for' endif return index(split('for if let while with'),token) + 1 endif - return !cursor(a:lnum, match(' ' . a:text, '\%(\%(\.\s*\)\@\)$\C')) + return pline =~# '\%(\%(\.\s*\)\@\)$' endfunction function s:iscontOne(i,num,cont) @@ -116,7 +114,7 @@ function s:iscontOne(i,num,cont) let bL = 0 while l:i >= l:num && (!l:cont || ind > pind) if indent(l:i) < ind " first line always true for !a:cont, false for !!a:cont - if s:OneScope(l:i,s:Trim(l:i)) + if s:OneScope(l:i) let bL += s:W let [l:cont, l:i] = [0, line('.')] elseif !l:cont @@ -136,9 +134,7 @@ function s:IsBlock() let l:ln = line('.') let char = s:previous_token() let syn = char =~ '[{>/]' || l:ln != line('.') ? synIDattr(synID(line('.'),col('.')-(char == '{'),0),'name') : '' - if char is '' || syn =~? 'regex' - return 1 - elseif syn =~? 'xml\|jsx' + if syn =~? 'xml\|jsx' return char != '{' elseif char =~ '\k' return index(split('return const let import export yield default delete var void typeof throw new in instanceof') @@ -149,7 +145,7 @@ function s:IsBlock() return !cursor(0,match(' ' . strpart(getline('.'),0,col('.')),'.*\zs' . s:case_stmt . '$')) && \ (expand('') !=# 'default' || s:previous_token() !~ '[,{]') endif - return char !~ '[-=~!<*+,/?^%|&([]' + return syn =~? 'regex' || char !~ '[-=~!<*+,/?^%|&([]' endfunction " Find line above 'lnum' that isn't empty or in a comment From 14919946c45e52f99f3a81e896daa7c974f6488c Mon Sep 17 00:00:00 2001 From: Chris Paul Date: Thu, 1 Dec 2016 12:01:27 -0800 Subject: [PATCH 028/435] date, code documenting --- indent/javascript.vim | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/indent/javascript.vim b/indent/javascript.vim index 1bdd6ab4..451e521b 100644 --- a/indent/javascript.vim +++ b/indent/javascript.vim @@ -2,7 +2,7 @@ " Language: Javascript " Maintainer: Chris Paul ( https://github.com/bounceme ) " URL: https://github.com/pangloss/vim-javascript -" Last Change: November 29, 2016 +" Last Change: December 1, 2016 " Only load this indent file when no other was loaded. if exists('b:did_indent') @@ -87,7 +87,8 @@ let s:opfirst = '^' . get(g:,'javascript_opfirst', let s:continuation = get(g:,'javascript_continuation', \ '\%([<=,.~!?/*^%|&:]\|+\@\|\%(\.\s*\)\@ Date: Thu, 1 Dec 2016 12:40:10 -0800 Subject: [PATCH 029/435] Indent: use previous Trim, with new interface (#741) --- indent/javascript.vim | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/indent/javascript.vim b/indent/javascript.vim index 451e521b..7739fc86 100644 --- a/indent/javascript.vim +++ b/indent/javascript.vim @@ -89,11 +89,14 @@ let s:continuation = get(g:,'javascript_continuation', " get the line of code stripped of comments. if called with two args, leave " cursor at the last non-comment char. -function s:Trim(lnum,...) - let p = a:0 ? [0,0] : getpos('.')[1:2] - let r = !cursor(a:lnum+1,1) && s:previous_token() isnot '' ? strpart(getline('.'),0,col('.')) : '' - call call('cursor',p) - return r +function s:Trim(ln,...) + let pline = substitute(getline(a:ln),'\s*$','','') + let l:max = max([match(pline,'.*\zs\%([^/]\zs\/\/\|\/\*\)'),0]) + while l:max && synIDattr(synID(a:ln, strlen(pline), 0), 'name') =~? 'comment\|doc' + let pline = substitute(strpart(pline, 0, l:max),'\s*$','','') + let l:max = max([match(pline,'.*\zs\%([^/]\zs\/\/\|\/\*\)'),0]) + endwhile + return !a:0 || cursor(a:ln,strlen(pline)) ? pline : pline endfunction function s:OneScope(lnum) From 6d81ec817a2ab7742d68d1b628a352abb50a4c9a Mon Sep 17 00:00:00 2001 From: Chris Paul Date: Fri, 2 Dec 2016 10:55:17 -0800 Subject: [PATCH 030/435] only Trim() if in a block (#743) --- indent/javascript.vim | 21 ++++++++++----------- 1 file changed, 10 insertions(+), 11 deletions(-) diff --git a/indent/javascript.vim b/indent/javascript.vim index 7739fc86..7267d014 100644 --- a/indent/javascript.vim +++ b/indent/javascript.vim @@ -231,9 +231,10 @@ function GetJavascriptIndent() let b:js_cache = [v:lnum] + (line('.') == v:lnum ? [0,0] : getpos('.')[1:2]) let num = b:js_cache[1] - let [s:W, pline, isOp, stmt, bL, switch_offset] = [s:sw(), s:Trim(l:lnum),0,0,0,0] - if num && s:looking_at() == '{' && s:IsBlock() - if s:looking_at() == ')' && s:GetPair('(', ')', 'bW', s:skip_expr, 100) > 0 + let [s:W, isOp, bL, switch_offset] = [s:sw(),0,0,0] + if !num || s:looking_at() == '{' && s:IsBlock() + let pline = s:Trim(l:lnum) + if num && s:looking_at() == ')' && s:GetPair('(', ')', 'bW', s:skip_expr, 100) > 0 let num = line('.') if s:previous_token() ==# 'switch' let switch_offset = &cino !~ ':' || !has('float') ? s:W : @@ -245,14 +246,12 @@ function GetJavascriptIndent() endif endif endif - let stmt = 1 - endif - - if stmt && pline[-1:] != '{' || !num - let isOp = l:line =~# s:opfirst || pline =~# s:continuation && - \ synIDattr(synID(l:lnum,match(' ' . pline,'\/$'),0),'name') !~? 'regex' - let bL = s:iscontOne(l:lnum,num,isOp) - let bL -= (bL && l:line[0] == '{') * s:W + if !num || pline[-1:] !~ '[{;]' + let isOp = l:line =~# s:opfirst || pline =~# s:continuation && + \ synIDattr(synID(l:lnum,match(' ' . pline,'\/$'),0),'name') !~? 'regex' + let bL = s:iscontOne(l:lnum,num,isOp) + let bL -= (bL && l:line[0] == '{') * s:W + endif endif " main return From 9f4772175444c1b8610f64a13909a93d9f1b8f66 Mon Sep 17 00:00:00 2001 From: Matt Carter Date: Sat, 3 Dec 2016 07:37:22 +1000 Subject: [PATCH 031/435] Added conceal for no-argument arrow functions - either `()=>` or `_=>` (#735) * Added conceal for no-argument arrow functions - either `()=>` or `_=>` * Split Arrow+no-arg and Arrow+underscore into two seperate config variables * Added README note about enabling conceal mode along with an example to toggle via key bindings --- README.md | 36 ++++++++++++++++++++++++------------ syntax/javascript.vim | 2 ++ 2 files changed, 26 insertions(+), 12 deletions(-) diff --git a/README.md b/README.md index 23ec94af..959b254f 100644 --- a/README.md +++ b/README.md @@ -84,18 +84,30 @@ global vim option, we do not set it ourselves. ## Concealing Characters You can customize concealing characters by defining one or more of the following -variables: - - let g:javascript_conceal_function = "ƒ" - let g:javascript_conceal_null = "ø" - let g:javascript_conceal_this = "@" - let g:javascript_conceal_return = "⇚" - let g:javascript_conceal_undefined = "¿" - let g:javascript_conceal_NaN = "ℕ" - let g:javascript_conceal_prototype = "¶" - let g:javascript_conceal_static = "•" - let g:javascript_conceal_super = "Ω" - let g:javascript_conceal_arrow_function = "⇒" +variables (these are all disabled by default): + + let g:javascript_conceal_function = "ƒ" + let g:javascript_conceal_null = "ø" + let g:javascript_conceal_this = "@" + let g:javascript_conceal_return = "⇚" + let g:javascript_conceal_undefined = "¿" + let g:javascript_conceal_NaN = "ℕ" + let g:javascript_conceal_prototype = "¶" + let g:javascript_conceal_static = "•" + let g:javascript_conceal_super = "Ω" + let g:javascript_conceal_arrow_function = "⇒" + let g:javascript_conceal_noarg_arrow_function = "🞅" + let g:javascript_conceal_underscore_arrow_function = "🞅" + + +You can enable concealing within VIM with: + + set conceallevel=1 + +OR if you wish to toggle concealing you may wish to bind a command such as the following which will map LEADER+L (leader is usually the comma key) to toggling conceal mode: + + map l :exec &conceallevel ? "set conceallevel=0" : "set conceallevel=1" + ## Indentation Specific diff --git a/syntax/javascript.vim b/syntax/javascript.vim index 478b4b46..3685646c 100644 --- a/syntax/javascript.vim +++ b/syntax/javascript.vim @@ -173,6 +173,8 @@ syntax match jsArrowFuncArgs /([^()]*)\s*\(=>\)\@=/ contains=jsFuncArgs skipe exe 'syntax match jsFunction /\/ skipwhite skipempty nextgroup=jsGenerator,jsFuncName,jsFuncArgs skipwhite '.(exists('g:javascript_conceal_function') ? 'conceal cchar='.g:javascript_conceal_function : '') exe 'syntax match jsArrowFunction /=>/ skipwhite skipempty nextgroup=jsFuncBlock,jsCommentFunction '.(exists('g:javascript_conceal_arrow_function') ? 'conceal cchar='.g:javascript_conceal_arrow_function : '') +exe 'syntax match jsArrowFunction /()\s*\(=>\)\@=/ skipwhite skipempty nextgroup=jsArrowFunction '.(exists('g:javascript_conceal_noarg_arrow_function') ? 'conceal cchar='.g:javascript_conceal_noarg_arrow_function : '') +exe 'syntax match jsArrowFunction /_\s*\(=>\)\@=/ skipwhite skipempty nextgroup=jsArrowFunction '.(exists('g:javascript_conceal_underscore_arrow_function') ? 'conceal cchar='.g:javascript_conceal_underscore_arrow_function : '') " Classes syntax keyword jsClassKeyword contained class From df14847ad3a1a7a24c1d98e28fa8f9a8564ebf42 Mon Sep 17 00:00:00 2001 From: Chris Paul Date: Fri, 2 Dec 2016 13:41:54 -0800 Subject: [PATCH 032/435] fix readme --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 959b254f..dedd48f5 100644 --- a/README.md +++ b/README.md @@ -83,7 +83,7 @@ global vim option, we do not set it ourselves. ## Concealing Characters -You can customize concealing characters by defining one or more of the following +You can customize concealing characters, if your font provides the character you want, by defining one or more of the following variables (these are all disabled by default): let g:javascript_conceal_function = "ƒ" @@ -104,7 +104,7 @@ You can enable concealing within VIM with: set conceallevel=1 -OR if you wish to toggle concealing you may wish to bind a command such as the following which will map LEADER+L (leader is usually the comma key) to toggling conceal mode: +OR if you wish to toggle concealing you may wish to bind a command such as the following which will map LEADER+L (leader is usually the `\` key) to toggling conceal mode: map l :exec &conceallevel ? "set conceallevel=0" : "set conceallevel=1" From 41a3bceb433947340e651de8e111eea436e71fd2 Mon Sep 17 00:00:00 2001 From: Chris Paul Date: Fri, 2 Dec 2016 13:44:04 -0800 Subject: [PATCH 033/435] more readme fixes --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index dedd48f5..c2dd3475 100644 --- a/README.md +++ b/README.md @@ -104,7 +104,7 @@ You can enable concealing within VIM with: set conceallevel=1 -OR if you wish to toggle concealing you may wish to bind a command such as the following which will map LEADER+L (leader is usually the `\` key) to toggling conceal mode: +OR if you wish to toggle concealing you may wish to bind a command such as the following which will map l (leader is usually the `\` key) to toggling conceal mode: map l :exec &conceallevel ? "set conceallevel=0" : "set conceallevel=1" From ba9501bfc763a9d648c2bf8ba90dde34bfda6301 Mon Sep 17 00:00:00 2001 From: Chris Paul Date: Fri, 2 Dec 2016 13:44:46 -0800 Subject: [PATCH 034/435] markdown fixes --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index c2dd3475..8e8bf434 100644 --- a/README.md +++ b/README.md @@ -104,7 +104,7 @@ You can enable concealing within VIM with: set conceallevel=1 -OR if you wish to toggle concealing you may wish to bind a command such as the following which will map l (leader is usually the `\` key) to toggling conceal mode: +OR if you wish to toggle concealing you may wish to bind a command such as the following which will map `l` (leader is usually the `\` key) to toggling conceal mode: map l :exec &conceallevel ? "set conceallevel=0" : "set conceallevel=1" From 9e0aa00b618cc2b5c78375322a9d1f91e50a5495 Mon Sep 17 00:00:00 2001 From: Chris Paul Date: Fri, 2 Dec 2016 13:49:05 -0800 Subject: [PATCH 035/435] clarify readme --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 8e8bf434..ba921744 100644 --- a/README.md +++ b/README.md @@ -84,7 +84,7 @@ global vim option, we do not set it ourselves. ## Concealing Characters You can customize concealing characters, if your font provides the character you want, by defining one or more of the following -variables (these are all disabled by default): +variables: let g:javascript_conceal_function = "ƒ" let g:javascript_conceal_null = "ø" From d2bc5d49e3306caca3dc81665b93112c239b1d0e Mon Sep 17 00:00:00 2001 From: Chris Paul Date: Fri, 2 Dec 2016 15:38:56 -0800 Subject: [PATCH 036/435] remove conditional --- indent/javascript.vim | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/indent/javascript.vim b/indent/javascript.vim index 7267d014..a7513ff2 100644 --- a/indent/javascript.vim +++ b/indent/javascript.vim @@ -246,7 +246,7 @@ function GetJavascriptIndent() endif endif endif - if !num || pline[-1:] !~ '[{;]' + if pline[-1:] !~ '[{;]' let isOp = l:line =~# s:opfirst || pline =~# s:continuation && \ synIDattr(synID(l:lnum,match(' ' . pline,'\/$'),0),'name') !~? 'regex' let bL = s:iscontOne(l:lnum,num,isOp) From d377f45bd8697e544efc4e9ce933bcc05f54c2f4 Mon Sep 17 00:00:00 2001 From: Chris Paul Date: Sat, 3 Dec 2016 11:52:47 -0800 Subject: [PATCH 037/435] regex simplified in trim() (#745) --- indent/javascript.vim | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/indent/javascript.vim b/indent/javascript.vim index a7513ff2..fdf8c9ac 100644 --- a/indent/javascript.vim +++ b/indent/javascript.vim @@ -76,7 +76,7 @@ function s:previous_token() return search('.\>\|[][`^!"%-/:-?{-~]','bW') ? \ (s:looking_at() == '/' || line('.') != l:ln && getline('.') =~ '\/\/') && \ synIDattr(synID(line('.'),col('.'),0),'name') =~? 'comment' ? - \ search('\%(\/\@/]' || l:ln != line('.') ? synIDattr(synID(line('.'),col('.')-(char == '{'),0),'name') : '' + let syn = char =~ '[{>/]' ? synIDattr(synID(line('.'),col('.')-(char == '{'),0),'name') : '' if syn =~? 'xml\|jsx' return char != '{' elseif char =~ '\k' From 554ae9b24e7fb5bf7a6bd4ba8502758a9e18a744 Mon Sep 17 00:00:00 2001 From: Chris Paul Date: Sat, 3 Dec 2016 20:06:47 -0800 Subject: [PATCH 038/435] package-manager info (#744) --- README.md | 29 ++--------------------------- 1 file changed, 2 insertions(+), 27 deletions(-) diff --git a/README.md b/README.md index ba921744..2c51c0ad 100644 --- a/README.md +++ b/README.md @@ -6,32 +6,12 @@ improved indentation. ## Installation -### Install with [Vundle](https://github.com/gmarik/vundle) - -Add to vimrc: - - Plugin 'pangloss/vim-javascript' - -And install it: - - :so ~/.vimrc - :PluginInstall - -### Install with [vim-plug](https://github.com/junegunn/vim-plug) - -Add to vimrc: - - Plug 'pangloss/vim-javascript' - -And install it: - - :so ~/.vimrc - :PlugInstall - ### Install with [pathogen](https://github.com/tpope/vim-pathogen) git clone https://github.com/pangloss/vim-javascript.git ~/.vim/bundle/vim-javascript +alternatively, use a package manager like [vim-plug](https://github.com/junegunn/vim-plug) + ## Configuration Variables @@ -124,11 +104,6 @@ maintainer(s) then, hopefully, merged. Thank you! -## Bug Reports - -Report a bug on [GitHub Issues](https://github.com/pangloss/vim-javascript/issues). - - ## License Distributed under the same terms as Vim itself. See `:help license`. From a210f3916ed7d1615d8ae86549935a8dc1a64066 Mon Sep 17 00:00:00 2001 From: Chris Paul Date: Sat, 3 Dec 2016 22:29:01 -0800 Subject: [PATCH 039/435] fix code comment --- indent/javascript.vim | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/indent/javascript.vim b/indent/javascript.vim index fdf8c9ac..0ede1ece 100644 --- a/indent/javascript.vim +++ b/indent/javascript.vim @@ -202,7 +202,7 @@ function GetJavascriptIndent() let l:line = substitute(substitute(l:line,'^\s*\%(\/\*.\{-}\*\/\s*\)*','',''),'^\/[/*].*','','') - " the containing paren, bracket, curly. Many hacks for performance + " the containing paren, bracket, or curly. Many hacks for performance call cursor(v:lnum,1) let idx = strlen(l:line) ? stridx('])}',l:line[0]) : -1 if indent(l:lnum) From d81b076b594284b3d234dd924dc73f4436bd5a77 Mon Sep 17 00:00:00 2001 From: Chris Paul Date: Sun, 4 Dec 2016 09:57:50 -0800 Subject: [PATCH 040/435] make regex for token() more intuitive (#746) --- indent/javascript.vim | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/indent/javascript.vim b/indent/javascript.vim index 0ede1ece..c08764ec 100644 --- a/indent/javascript.vim +++ b/indent/javascript.vim @@ -73,7 +73,7 @@ endfunction " NOTE: moves the cursor function s:previous_token() let l:ln = line('.') - return search('.\>\|[][`^!"%-/:-?{-~]','bW') ? + return search('.\>\|[^[:alnum:][:space:]_$]','bW') ? \ (s:looking_at() == '/' || line('.') != l:ln && getline('.') =~ '\/\/') && \ synIDattr(synID(line('.'),col('.'),0),'name') =~? 'comment' ? \ search('\_[^/]\zs\/[/*]','bW') ? s:previous_token() : '' From 039c611e1a6af83e3ce34283630a9d811fc97981 Mon Sep 17 00:00:00 2001 From: Chris Paul Date: Mon, 5 Dec 2016 12:28:20 -0800 Subject: [PATCH 041/435] refactor v:lnum cleaning (#748) faster, more readable --- indent/javascript.vim | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/indent/javascript.vim b/indent/javascript.vim index c08764ec..4922b541 100644 --- a/indent/javascript.vim +++ b/indent/javascript.vim @@ -199,11 +199,17 @@ function GetJavascriptIndent() if !l:lnum return endif + call cursor(v:lnum,1) - let l:line = substitute(substitute(l:line,'^\s*\%(\/\*.\{-}\*\/\s*\)*','',''),'^\/[/*].*','','') + let l:line = l:line[indent('.'):] + if l:line[:1] == '/*' + let l:line = substitute(l:line,'^\%(\/\*.\{-}\*\/\s*\)*','','') + endif + if l:line =~ '^\/[/*]' + let l:line = '' + endif " the containing paren, bracket, or curly. Many hacks for performance - call cursor(v:lnum,1) let idx = strlen(l:line) ? stridx('])}',l:line[0]) : -1 if indent(l:lnum) let [s:looksyn,s:free] = [v:lnum - 1,1] From 82f064a12a2c50fbaa2716756613a56010ce5402 Mon Sep 17 00:00:00 2001 From: Chris Paul Date: Mon, 5 Dec 2016 12:36:50 -0800 Subject: [PATCH 042/435] match isk in token regex (#749) the @ is a vim/vi default part of iskeyword. also decorators --- indent/javascript.vim | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/indent/javascript.vim b/indent/javascript.vim index 4922b541..d48faf2f 100644 --- a/indent/javascript.vim +++ b/indent/javascript.vim @@ -73,7 +73,7 @@ endfunction " NOTE: moves the cursor function s:previous_token() let l:ln = line('.') - return search('.\>\|[^[:alnum:][:space:]_$]','bW') ? + return search('.\>\|[^[:alnum:][:space:]_$@]','bW') ? \ (s:looking_at() == '/' || line('.') != l:ln && getline('.') =~ '\/\/') && \ synIDattr(synID(line('.'),col('.'),0),'name') =~? 'comment' ? \ search('\_[^/]\zs\/[/*]','bW') ? s:previous_token() : '' From e807258688e5355dada2d1cf963f614f15468284 Mon Sep 17 00:00:00 2001 From: Chris Paul Date: Mon, 5 Dec 2016 12:50:53 -0800 Subject: [PATCH 043/435] Revert "match isk in token regex" (#750) --- indent/javascript.vim | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/indent/javascript.vim b/indent/javascript.vim index d48faf2f..4922b541 100644 --- a/indent/javascript.vim +++ b/indent/javascript.vim @@ -73,7 +73,7 @@ endfunction " NOTE: moves the cursor function s:previous_token() let l:ln = line('.') - return search('.\>\|[^[:alnum:][:space:]_$@]','bW') ? + return search('.\>\|[^[:alnum:][:space:]_$]','bW') ? \ (s:looking_at() == '/' || line('.') != l:ln && getline('.') =~ '\/\/') && \ synIDattr(synID(line('.'),col('.'),0),'name') =~? 'comment' ? \ search('\_[^/]\zs\/[/*]','bW') ? s:previous_token() : '' From 3cc3ef7c112b4a5fa465239712aba56111850900 Mon Sep 17 00:00:00 2001 From: Chris Paul Date: Tue, 6 Dec 2016 11:03:39 -0800 Subject: [PATCH 044/435] cleaning (#751) * cleaning * update cache inside of string * switch case accuracy * case * Update javascript.vim * edge cases * cleaning * ws * extract to var --- indent/javascript.vim | 42 +++++++++++++++++++++++------------------- 1 file changed, 23 insertions(+), 19 deletions(-) diff --git a/indent/javascript.vim b/indent/javascript.vim index 4922b541..7794a59f 100644 --- a/indent/javascript.vim +++ b/indent/javascript.vim @@ -36,10 +36,12 @@ else endfunction endif -let s:case_stmt = '\%(\.\s*\)\@\s*[^ \t:].*\|default\s*\):\C' +let s:case_stmt = '\<\%(case\>\s*[^ \t:].*\|default\s*\):\C' " Regex of syntax group names that are or delimit string or are comments. let s:syng_strcom = 'string\|comment\|regex\|special\|doc\|template' +let s:syng_str = 'string\|template' +let s:syng_com = 'comment\|doc' " Expression used to check whether we should skip a match with searchpair(). let s:skip_expr = "synIDattr(synID(line('.'),col('.'),0),'name') =~? '".s:syng_strcom."'" function s:skip_func(lnum) @@ -75,7 +77,7 @@ function s:previous_token() let l:ln = line('.') return search('.\>\|[^[:alnum:][:space:]_$]','bW') ? \ (s:looking_at() == '/' || line('.') != l:ln && getline('.') =~ '\/\/') && - \ synIDattr(synID(line('.'),col('.'),0),'name') =~? 'comment' ? + \ synIDattr(synID(line('.'),col('.'),0),'name') =~? s:syng_com ? \ search('\_[^/]\zs\/[/*]','bW') ? s:previous_token() : '' \ : s:token() \ : '' @@ -92,7 +94,7 @@ let s:continuation = get(g:,'javascript_continuation', function s:Trim(ln,...) let pline = substitute(getline(a:ln),'\s*$','','') let l:max = max([match(pline,'.*[^/]\zs\/[/*]'),0]) - while l:max && synIDattr(synID(a:ln, strlen(pline), 0), 'name') =~? 'comment\|doc' + while l:max && synIDattr(synID(a:ln, strlen(pline), 0), 'name') =~? s:syng_com let pline = substitute(strpart(pline, 0, l:max),'\s*$','','') let l:max = max([match(pline,'.*[^/]\zs\/[/*]'),0]) endwhile @@ -147,7 +149,7 @@ function s:IsBlock() return getline('.')[col('.')-2] == '=' || syn =~? '^jsflow' elseif char == ':' return !cursor(0,match(' ' . strpart(getline('.'),0,col('.')),'.*\zs' . s:case_stmt . '$')) && - \ (expand('') !=# 'default' || s:previous_token() !~ '[,{]') + \ (expand('') !=# 'default' || s:previous_token() !~ '[{,.]') endif return syn =~? 'regex' || char !~ '[-=~!<*+,/?^%|&([]' endfunction @@ -156,7 +158,7 @@ endfunction function s:PrevCodeLine(lnum) let l:n = prevnonblank(a:lnum) while getline(l:n) =~ '^\s*\/[/*]' || synIDattr(synID(l:n,1,0),'name') =~? - \ 'comment\|doc' + \ s:syng_com let l:n = prevnonblank(l:n-1) endwhile return l:n @@ -186,13 +188,16 @@ function GetJavascriptIndent() let syns = synIDattr(synID(v:lnum, 1, 0), 'name') " start with strings,comments,etc. - if syns =~? 'comment\|doc' + if syns =~? s:syng_com if l:line =~ '^\s*\*' return cindent(v:lnum) elseif l:line !~ '^\s*\/[/*]' return -1 endif - elseif syns =~? 'string\|template' && l:line !~ '^[''"]' + elseif syns =~? s:syng_str && l:line !~ '^[''"]' + if b:js_cache[0] == v:lnum - 1 && s:Balanced(v:lnum-1) + let b:js_cache[0] = v:lnum + endif return -1 endif let l:lnum = s:PrevCodeLine(v:lnum - 1) @@ -211,20 +216,19 @@ function GetJavascriptIndent() " the containing paren, bracket, or curly. Many hacks for performance let idx = strlen(l:line) ? stridx('])}',l:line[0]) : -1 - if indent(l:lnum) - let [s:looksyn,s:free] = [v:lnum - 1,1] - if b:js_cache[0] >= l:lnum && b:js_cache[0] < v:lnum && - \ (b:js_cache[0] > l:lnum || s:Balanced(l:lnum)) - call call('cursor',b:js_cache[1:]) - elseif idx + 1 - call s:GetPair(['\[','(','{'][idx], '])}'[idx],'bW','s:skip_func(s:looksyn)',2000) + if b:js_cache[0] >= l:lnum && b:js_cache[0] < v:lnum && + \ (b:js_cache[0] > l:lnum || s:Balanced(l:lnum)) + call call('cursor',b:js_cache[1:]) + else + let [s:looksyn, s:free, top] = [v:lnum - 1, 1, (!indent(l:lnum) && + \ synIDattr(synID(l:lnum,1,0),'name') !~? s:syng_str) * l:lnum] + if idx + 1 + call s:GetPair(['\[','(','{'][idx], '])}'[idx],'bW','s:skip_func(s:looksyn)',2000,top) elseif indent(v:lnum) && syns =~? 'block' - call s:GetPair('{','}','bW','s:skip_func(s:looksyn)',2000) + call s:GetPair('{','}','bW','s:skip_func(s:looksyn)',2000,top) else - call s:GetPair('[({[]','[])}]','bW','s:skip_func(s:looksyn)',2000) + call s:GetPair('[({[]','[])}]','bW','s:skip_func(s:looksyn)',2000,top) endif - else - call s:GetPair('[({[]','[])}]','bW',s:skip_expr,200,l:lnum) endif if idx + 1 @@ -245,7 +249,7 @@ function GetJavascriptIndent() if s:previous_token() ==# 'switch' let switch_offset = &cino !~ ':' || !has('float') ? s:W : \ float2nr(str2float(matchstr(&cino,'.*:\zs[-0-9.]*')) * (&cino =~# '\%(.*:\)\@>[^,]*s' ? s:W : 1)) - if l:line =~# '^' . s:case_stmt + if pline[-1:] != '.' && l:line =~# '^' . s:case_stmt return indent(num) + switch_offset elseif pline =~# s:case_stmt . '$' return indent(l:lnum) + s:W From afecff2b544a9c479debba6520b5678d8ea7d25e Mon Sep 17 00:00:00 2001 From: Chris Paul Date: Wed, 7 Dec 2016 11:05:45 -0800 Subject: [PATCH 045/435] v:lnum cleaning --- indent/javascript.vim | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/indent/javascript.vim b/indent/javascript.vim index 7794a59f..c9a7b7d0 100644 --- a/indent/javascript.vim +++ b/indent/javascript.vim @@ -204,9 +204,8 @@ function GetJavascriptIndent() if !l:lnum return endif - call cursor(v:lnum,1) - let l:line = l:line[indent('.'):] + let l:line = substitute(l:line,'^\s*','','') if l:line[:1] == '/*' let l:line = substitute(l:line,'^\%(\/\*.\{-}\*\/\s*\)*','','') endif @@ -215,6 +214,7 @@ function GetJavascriptIndent() endif " the containing paren, bracket, or curly. Many hacks for performance + call cursor(v:lnum,1) let idx = strlen(l:line) ? stridx('])}',l:line[0]) : -1 if b:js_cache[0] >= l:lnum && b:js_cache[0] < v:lnum && \ (b:js_cache[0] > l:lnum || s:Balanced(l:lnum)) From 0bf390d9c795724196379496ebb465b3a15183d8 Mon Sep 17 00:00:00 2001 From: Chris Paul Date: Wed, 7 Dec 2016 15:04:57 -0800 Subject: [PATCH 046/435] optimize indent with basic syntax file (#753) --- indent/javascript.vim | 29 +++++++++++++++++++++++------ 1 file changed, 23 insertions(+), 6 deletions(-) diff --git a/indent/javascript.vim b/indent/javascript.vim index c9a7b7d0..687d8a13 100644 --- a/indent/javascript.vim +++ b/indent/javascript.vim @@ -2,7 +2,7 @@ " Language: Javascript " Maintainer: Chris Paul ( https://github.com/bounceme ) " URL: https://github.com/pangloss/vim-javascript -" Last Change: December 1, 2016 +" Last Change: December 7, 2016 " Only load this indent file when no other was loaded. if exists('b:did_indent') @@ -44,8 +44,9 @@ let s:syng_str = 'string\|template' let s:syng_com = 'comment\|doc' " Expression used to check whether we should skip a match with searchpair(). let s:skip_expr = "synIDattr(synID(line('.'),col('.'),0),'name') =~? '".s:syng_strcom."'" -function s:skip_func(lnum) - if !s:free || search('`\|\*\/','nW',a:lnum) + +function s:skip_func() + if !s:free || search('`\|\*\/','nW',s:looksyn) let s:free = !eval(s:skip_expr) let s:looksyn = s:free ? line('.') : s:looksyn return !s:free @@ -54,6 +55,22 @@ function s:skip_func(lnum) return (search('\/','nbW',s:looksyn) || search('[''"\\]','nW',s:looksyn)) && eval(s:skip_expr) endfunction +function s:alternatePair(stop) + while search('[][(){}]','bW',a:stop) + if !s:skip_func() + let idx = stridx('])}',s:looking_at()) + if idx + 1 + if !s:GetPair(['\[','(','{'][idx], '])}'[idx],'bW','s:skip_func()',2000,a:stop) + break + endif + else + return + endif + endif + endwhile + call cursor(v:lnum,1) +endfunction + if has('reltime') function s:GetPair(start,end,flags,skip,time,...) return searchpair(a:start,'',a:end,a:flags,a:skip,max([prevnonblank(v:lnum) - 2000,0] + a:000),a:time) @@ -223,11 +240,11 @@ function GetJavascriptIndent() let [s:looksyn, s:free, top] = [v:lnum - 1, 1, (!indent(l:lnum) && \ synIDattr(synID(l:lnum,1,0),'name') !~? s:syng_str) * l:lnum] if idx + 1 - call s:GetPair(['\[','(','{'][idx], '])}'[idx],'bW','s:skip_func(s:looksyn)',2000,top) + call s:GetPair(['\[','(','{'][idx], '])}'[idx],'bW','s:skip_func()',2000,top) elseif indent(v:lnum) && syns =~? 'block' - call s:GetPair('{','}','bW','s:skip_func(s:looksyn)',2000,top) + call s:GetPair('{','}','bW','s:skip_func()',2000,top) else - call s:GetPair('[({[]','[])}]','bW','s:skip_func(s:looksyn)',2000,top) + call s:alternatePair(top) endif endif From 0dd9ad3b43a2626014bc33b1de5f4f75c63f2acc Mon Sep 17 00:00:00 2001 From: Amadeus Demarzi Date: Wed, 7 Dec 2016 19:29:31 -0800 Subject: [PATCH 047/435] Fix array destructuring as func arg definitions Had object destructuring, forgot to include array destructuring. All should be well in the world now. --- syntax/javascript.vim | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/syntax/javascript.vim b/syntax/javascript.vim index 3685646c..52bafbac 100644 --- a/syntax/javascript.vim +++ b/syntax/javascript.vim @@ -141,7 +141,7 @@ syntax region jsParenIfElse contained matchgroup=jsParensIfElse s syntax region jsParenRepeat contained matchgroup=jsParensRepeat start=/(/ end=/)/ contains=@jsAll skipwhite skipempty nextgroup=jsCommentMisc,jsRepeatBlock extend fold syntax region jsParenSwitch contained matchgroup=jsParensSwitch start=/(/ end=/)/ contains=@jsAll skipwhite skipempty nextgroup=jsSwitchBlock extend fold syntax region jsParenCatch contained matchgroup=jsParensCatch start=/(/ end=/)/ skipwhite skipempty nextgroup=jsTryCatchBlock extend fold -syntax region jsFuncArgs contained matchgroup=jsFuncParens start=/(/ end=/)/ contains=jsFuncArgCommas,jsComment,jsFuncArgExpression,jsDestructuringBlock,jsRestExpression,jsFlowArgumentDef skipwhite skipempty nextgroup=jsCommentFunction,jsFuncBlock,jsFlowReturn extend fold +syntax region jsFuncArgs contained matchgroup=jsFuncParens start=/(/ end=/)/ contains=jsFuncArgCommas,jsComment,jsFuncArgExpression,jsDestructuringBlock,jsDestructuringArray,jsRestExpression,jsFlowArgumentDef skipwhite skipempty nextgroup=jsCommentFunction,jsFuncBlock,jsFlowReturn extend fold syntax region jsClassBlock contained matchgroup=jsClassBraces start=/{/ end=/}/ contains=jsClassFuncName,jsClassMethodType,jsArrowFunction,jsArrowFuncArgs,jsComment,jsGenerator,jsDecorator,jsClassProperty,jsClassPropertyComputed,jsClassStringKey,jsNoise extend fold syntax region jsFuncBlock contained matchgroup=jsFuncBraces start=/{/ end=/}/ contains=@jsAll extend fold syntax region jsIfElseBlock contained matchgroup=jsIfElseBraces start=/{/ end=/}/ contains=@jsAll extend fold From 9db487d00381050ac6eae095706716284beed501 Mon Sep 17 00:00:00 2001 From: Chris Paul Date: Fri, 9 Dec 2016 23:43:20 -0800 Subject: [PATCH 048/435] add option in s:prev_token() (#757) --- indent/javascript.vim | 116 +++++++++++++++++++++++------------------- 1 file changed, 64 insertions(+), 52 deletions(-) diff --git a/indent/javascript.vim b/indent/javascript.vim index 687d8a13..39629765 100644 --- a/indent/javascript.vim +++ b/indent/javascript.vim @@ -2,7 +2,7 @@ " Language: Javascript " Maintainer: Chris Paul ( https://github.com/bounceme ) " URL: https://github.com/pangloss/vim-javascript -" Last Change: December 7, 2016 +" Last Change: December 9, 2016 " Only load this indent file when no other was loaded. if exists('b:did_indent') @@ -36,7 +36,16 @@ else endfunction endif -let s:case_stmt = '\<\%(case\>\s*[^ \t:].*\|default\s*\):\C' +" searchpair() wrapper +if has('reltime') + function s:GetPair(start,end,flags,skip,time,...) + return searchpair(a:start,'',a:end,a:flags,a:skip,max([prevnonblank(v:lnum) - 2000,0] + a:000),a:time) + endfunction +else + function s:GetPair(start,end,flags,skip,...) + return searchpair(a:start,'',a:end,a:flags,a:skip,max([prevnonblank(v:lnum) - 1000,get(a:000,1)])) + endfunction +endif " Regex of syntax group names that are or delimit string or are comments. let s:syng_strcom = 'string\|comment\|regex\|special\|doc\|template' @@ -71,15 +80,9 @@ function s:alternatePair(stop) call cursor(v:lnum,1) endfunction -if has('reltime') - function s:GetPair(start,end,flags,skip,time,...) - return searchpair(a:start,'',a:end,a:flags,a:skip,max([prevnonblank(v:lnum) - 2000,0] + a:000),a:time) - endfunction -else - function s:GetPair(start,end,flags,skip,...) - return searchpair(a:start,'',a:end,a:flags,a:skip,max([prevnonblank(v:lnum) - 1000,get(a:000,1)])) - endfunction -endif +function s:syn_at(l,c) + return synIDattr(synID(a:l,a:c,0),'name') +endfunction function s:looking_at() return getline('.')[col('.')-1] @@ -89,17 +92,20 @@ function s:token() return s:looking_at() =~ '\k' ? expand('') : s:looking_at() endfunction -" NOTE: moves the cursor -function s:previous_token() - let l:ln = line('.') - return search('.\>\|[^[:alnum:][:space:]_$]','bW') ? - \ (s:looking_at() == '/' || line('.') != l:ln && getline('.') =~ '\/\/') && - \ synIDattr(synID(line('.'),col('.'),0),'name') =~? s:syng_com ? +" NOTE: Moves the cursor, unless a arg is supplied. +function s:previous_token(...) + let l:pos = getpos('.')[1:2] + return [search('.\>\|[^[:alnum:][:space:]_$]','bW') ? + \ (s:looking_at() == '/' || line('.') != l:pos[0] && getline('.') =~ '\/\/') && + \ s:syn_at(line('.'),col('.')) =~? s:syng_com ? \ search('\_[^/]\zs\/[/*]','bW') ? s:previous_token() : '' \ : s:token() - \ : '' + \ : ''][a:0 && call('cursor',l:pos)] endfunction +" switch case label pattern +let s:case_stmt = '\<\%(case\>\s*[^ \t:].*\|default\s*\):\C' + " configurable regexes that define continuation lines, not including (, {, or [. let s:opfirst = '^' . get(g:,'javascript_opfirst', \ '\%([<>=,?^%|*/&]\|\([-.:+]\)\1\@!\|!=\|in\%(stanceof\)\=\>\)') @@ -111,13 +117,40 @@ let s:continuation = get(g:,'javascript_continuation', function s:Trim(ln,...) let pline = substitute(getline(a:ln),'\s*$','','') let l:max = max([match(pline,'.*[^/]\zs\/[/*]'),0]) - while l:max && synIDattr(synID(a:ln, strlen(pline), 0), 'name') =~? s:syng_com + while l:max && s:syn_at(a:ln, strlen(pline)) =~? s:syng_com let pline = substitute(strpart(pline, 0, l:max),'\s*$','','') let l:max = max([match(pline,'.*[^/]\zs\/[/*]'),0]) endwhile return !a:0 || cursor(a:ln,strlen(pline)) ? pline : pline endfunction +" Find line above 'lnum' that isn't empty or in a comment +function s:PrevCodeLine(lnum) + let l:n = prevnonblank(a:lnum) + while getline(l:n) =~ '^\s*\/[/*]' || s:syn_at(l:n,1) =~? s:syng_com + let l:n = prevnonblank(l:n-1) + endwhile + return l:n +endfunction + +" Check if line 'lnum' has a balanced amount of parentheses. +function s:Balanced(lnum) + let l:open = 0 + let l:line = getline(a:lnum) + let pos = match(l:line, '[][(){}]', 0) + while pos != -1 + if s:syn_at(a:lnum,pos + 1) !~? s:syng_strcom + let l:open += match(' ' . l:line[pos],'[[({]') + if l:open < 0 + return + endif + endif + let pos = match(l:line, '[][(){}]', pos + 1) + endwhile + return !l:open +endfunction + +" start of a braceless scope? function s:OneScope(lnum) let pline = s:Trim(a:lnum,1) if pline[-1:] == ')' && s:GetPair('(', ')', 'bW', s:skip_expr, 100) > 0 @@ -127,16 +160,22 @@ function s:OneScope(lnum) endif return index(split('for if let while with'),token) + 1 endif - return pline =~# '\%(\%(\.\s*\)\@\)$' + return eval((['getline(".")[col(".")-2] == "="'] + + \ repeat(['s:previous_token(1) != "."'],2) + [0])[ + \ index(split('> else do'),s:token())]) endfunction +" returns braceless levels started by 'i' and above lines * &sw. +" 'num' is the lineNr which encloses the entire context, 'cont' if whether +" line 'i' + 1 is a continued expression, which could have started in a +" braceless context created above 'i' function s:iscontOne(i,num,cont) let [l:i, l:cont, l:num] = [a:i, a:cont, a:num + !a:num] let pind = a:num ? indent(l:num) + s:W : 0 let ind = indent(l:i) + (a:cont ? 0 : s:W) let bL = 0 while l:i >= l:num && (!l:cont || ind > pind) - if indent(l:i) < ind " first line always true for !a:cont, false for !!a:cont + if indent(l:i) < ind " first line depends on a:cont if s:OneScope(l:i) let bL += s:W let [l:cont, l:i] = [0, line('.')] @@ -156,7 +195,7 @@ endfunction function s:IsBlock() let l:ln = line('.') let char = s:previous_token() - let syn = char =~ '[{>/]' ? synIDattr(synID(line('.'),col('.')-(char == '{'),0),'name') : '' + let syn = char =~ '[{>/]' ? s:syn_at(line('.'),col('.')-(char == '{')) : '' if syn =~? 'xml\|jsx' return char != '{' elseif char =~ '\k' @@ -171,38 +210,11 @@ function s:IsBlock() return syn =~? 'regex' || char !~ '[-=~!<*+,/?^%|&([]' endfunction -" Find line above 'lnum' that isn't empty or in a comment -function s:PrevCodeLine(lnum) - let l:n = prevnonblank(a:lnum) - while getline(l:n) =~ '^\s*\/[/*]' || synIDattr(synID(l:n,1,0),'name') =~? - \ s:syng_com - let l:n = prevnonblank(l:n-1) - endwhile - return l:n -endfunction - -" Check if line 'lnum' has a balanced amount of parentheses. -function s:Balanced(lnum) - let l:open = 0 - let l:line = getline(a:lnum) - let pos = match(l:line, '[][(){}]', 0) - while pos != -1 - if synIDattr(synID(a:lnum,pos + 1,0),'name') !~? s:syng_strcom - let l:open += match(' ' . l:line[pos],'[[({]') - if l:open < 0 - return - endif - endif - let pos = match(l:line, '[][(){}]', pos + 1) - endwhile - return !l:open -endfunction - function GetJavascriptIndent() let b:js_cache = get(b:,'js_cache',[0,0,0]) " Get the current line. let l:line = getline(v:lnum) - let syns = synIDattr(synID(v:lnum, 1, 0), 'name') + let syns = s:syn_at(v:lnum, 1) " start with strings,comments,etc. if syns =~? s:syng_com @@ -238,7 +250,7 @@ function GetJavascriptIndent() call call('cursor',b:js_cache[1:]) else let [s:looksyn, s:free, top] = [v:lnum - 1, 1, (!indent(l:lnum) && - \ synIDattr(synID(l:lnum,1,0),'name') !~? s:syng_str) * l:lnum] + \ s:syn_at(l:lnum,1) !~? s:syng_str) * l:lnum] if idx + 1 call s:GetPair(['\[','(','{'][idx], '])}'[idx],'bW','s:skip_func()',2000,top) elseif indent(v:lnum) && syns =~? 'block' @@ -275,7 +287,7 @@ function GetJavascriptIndent() endif if pline[-1:] !~ '[{;]' let isOp = l:line =~# s:opfirst || pline =~# s:continuation && - \ synIDattr(synID(l:lnum,match(' ' . pline,'\/$'),0),'name') !~? 'regex' + \ s:syn_at(l:lnum,match(' ' . pline,'\/$')) !~? 'regex' let bL = s:iscontOne(l:lnum,num,isOp) let bL -= (bL && l:line[0] == '{') * s:W endif From 4149f1d30448cb5f2841b12d95c46146b2d39fe9 Mon Sep 17 00:00:00 2001 From: Chris Paul Date: Sat, 10 Dec 2016 15:31:00 -0800 Subject: [PATCH 049/435] cleaning continued braceless statement (#758) --- indent/javascript.vim | 20 +++++++------------- 1 file changed, 7 insertions(+), 13 deletions(-) diff --git a/indent/javascript.vim b/indent/javascript.vim index 39629765..aab3678a 100644 --- a/indent/javascript.vim +++ b/indent/javascript.vim @@ -150,7 +150,6 @@ function s:Balanced(lnum) return !l:open endfunction -" start of a braceless scope? function s:OneScope(lnum) let pline = s:Trim(a:lnum,1) if pline[-1:] == ')' && s:GetPair('(', ')', 'bW', s:skip_expr, 100) > 0 @@ -168,21 +167,16 @@ endfunction " returns braceless levels started by 'i' and above lines * &sw. " 'num' is the lineNr which encloses the entire context, 'cont' if whether " line 'i' + 1 is a continued expression, which could have started in a -" braceless context created above 'i' +" braceless context function s:iscontOne(i,num,cont) - let [l:i, l:cont, l:num] = [a:i, a:cont, a:num + !a:num] + let [l:i, l:num, bL] = [a:i, a:num + !a:num, 0] let pind = a:num ? indent(l:num) + s:W : 0 let ind = indent(l:i) + (a:cont ? 0 : s:W) - let bL = 0 - while l:i >= l:num && (!l:cont || ind > pind) - if indent(l:i) < ind " first line depends on a:cont - if s:OneScope(l:i) - let bL += s:W - let [l:cont, l:i] = [0, line('.')] - elseif !l:cont - break - endif - elseif !a:cont + while l:i >= l:num && (ind > pind || l:i == l:num) + if indent(l:i) < ind && s:OneScope(l:i) + let bL += s:W + let l:i = line('.') + elseif !a:cont || bL || ind < indent(a:i) break endif let ind = min([ind, indent(l:i)]) From 3583822dab4be5b11c285233535ebf56b986524e Mon Sep 17 00:00:00 2001 From: Chris Paul Date: Sat, 10 Dec 2016 18:05:58 -0800 Subject: [PATCH 050/435] reflow comment --- indent/javascript.vim | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/indent/javascript.vim b/indent/javascript.vim index aab3678a..8059e0b0 100644 --- a/indent/javascript.vim +++ b/indent/javascript.vim @@ -2,7 +2,7 @@ " Language: Javascript " Maintainer: Chris Paul ( https://github.com/bounceme ) " URL: https://github.com/pangloss/vim-javascript -" Last Change: December 9, 2016 +" Last Change: December 10, 2016 " Only load this indent file when no other was loaded. if exists('b:did_indent') @@ -164,10 +164,9 @@ function s:OneScope(lnum) \ index(split('> else do'),s:token())]) endfunction -" returns braceless levels started by 'i' and above lines * &sw. -" 'num' is the lineNr which encloses the entire context, 'cont' if whether -" line 'i' + 1 is a continued expression, which could have started in a -" braceless context +" returns braceless levels started by 'i' and above lines * &sw. 'num' is the +" lineNr which encloses the entire context, 'cont' if whether line 'i' + 1 is +" a continued expression, which could have started in a braceless context function s:iscontOne(i,num,cont) let [l:i, l:num, bL] = [a:i, a:num + !a:num, 0] let pind = a:num ? indent(l:num) + s:W : 0 From 25cff858e5f5f1fdc65f35d75fd52fdbc091e0bc Mon Sep 17 00:00:00 2001 From: Chris Paul Date: Sat, 10 Dec 2016 19:07:58 -0800 Subject: [PATCH 051/435] don't move cursor at default label --- indent/javascript.vim | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/indent/javascript.vim b/indent/javascript.vim index 8059e0b0..d8de150a 100644 --- a/indent/javascript.vim +++ b/indent/javascript.vim @@ -198,7 +198,7 @@ function s:IsBlock() return getline('.')[col('.')-2] == '=' || syn =~? '^jsflow' elseif char == ':' return !cursor(0,match(' ' . strpart(getline('.'),0,col('.')),'.*\zs' . s:case_stmt . '$')) && - \ (expand('') !=# 'default' || s:previous_token() !~ '[{,.]') + \ (expand('') !=# 'default' || s:previous_token(1) !~ '[{,.]') endif return syn =~? 'regex' || char !~ '[-=~!<*+,/?^%|&([]' endfunction From 8e17e2330c4bb252d9657f1cea34159367f7cdad Mon Sep 17 00:00:00 2001 From: Ryan Bright Date: Sun, 11 Dec 2016 03:44:26 -0500 Subject: [PATCH 052/435] Detect .es6 files as JavaScript (#199) --- ftdetect/javascript.vim | 1 + 1 file changed, 1 insertion(+) diff --git a/ftdetect/javascript.vim b/ftdetect/javascript.vim index d6aa6d01..f42e06f8 100644 --- a/ftdetect/javascript.vim +++ b/ftdetect/javascript.vim @@ -1,6 +1,7 @@ au BufNewFile,BufRead *.js setf javascript au BufNewFile,BufRead *.jsm setf javascript au BufNewFile,BufRead Jakefile setf javascript +au BufNewFile,BufRead *.es6 setf javascript fun! s:SelectJavascript() if getline(1) =~# '^#!.*/bin/\%(env\s\+\)\?node\>' From 63daab731daf93e1503667f2f24ff619f504186f Mon Sep 17 00:00:00 2001 From: Chris Paul Date: Sun, 11 Dec 2016 18:36:15 -0800 Subject: [PATCH 053/435] better &cino parsing (#759) --- indent/javascript.vim | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/indent/javascript.vim b/indent/javascript.vim index d8de150a..c8142778 100644 --- a/indent/javascript.vim +++ b/indent/javascript.vim @@ -269,8 +269,12 @@ function GetJavascriptIndent() if num && s:looking_at() == ')' && s:GetPair('(', ')', 'bW', s:skip_expr, 100) > 0 let num = line('.') if s:previous_token() ==# 'switch' - let switch_offset = &cino !~ ':' || !has('float') ? s:W : - \ float2nr(str2float(matchstr(&cino,'.*:\zs[-0-9.]*')) * (&cino =~# '\%(.*:\)\@>[^,]*s' ? s:W : 1)) + if &cino !~ ':' || !has('float') + let switch_offset = s:W + else + let cinc = matchlist(&cino,'.*:\(-\)\=\([0-9.]*\)\(s\)\=\C') + let switch_offset = float2nr(str2float(cinc[1].(strlen(cinc[2]) ? cinc[2] : 1)) * (strlen(cinc[3]) ? s:W : 1)) + endif if pline[-1:] != '.' && l:line =~# '^' . s:case_stmt return indent(num) + switch_offset elseif pline =~# s:case_stmt . '$' From 294563c6181215270fa645a685264ecb724471d2 Mon Sep 17 00:00:00 2001 From: Chris Paul Date: Sun, 11 Dec 2016 18:54:14 -0800 Subject: [PATCH 054/435] &cino format --- indent/javascript.vim | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/indent/javascript.vim b/indent/javascript.vim index c8142778..e072ad16 100644 --- a/indent/javascript.vim +++ b/indent/javascript.vim @@ -273,7 +273,8 @@ function GetJavascriptIndent() let switch_offset = s:W else let cinc = matchlist(&cino,'.*:\(-\)\=\([0-9.]*\)\(s\)\=\C') - let switch_offset = float2nr(str2float(cinc[1].(strlen(cinc[2]) ? cinc[2] : 1)) * (strlen(cinc[3]) ? s:W : 1)) + let switch_offset = float2nr(str2float(cinc[1].(strlen(cinc[2]) ? cinc[2] : strlen(cinc[3]))) + \ * (strlen(cinc[3]) ? s:W : 1)) endif if pline[-1:] != '.' && l:line =~# '^' . s:case_stmt return indent(num) + switch_offset From 117c7272188bbd2417a4d1addb8f90a0de52e91d Mon Sep 17 00:00:00 2001 From: Chris Paul Date: Thu, 15 Dec 2016 10:02:15 -0800 Subject: [PATCH 055/435] more edge case accuracy,refactoring (#761) * more edge case accuracy,refactoring * missing paren * label func * remove if * ws --- indent/javascript.vim | 24 +++++++++++++++++------- 1 file changed, 17 insertions(+), 7 deletions(-) diff --git a/indent/javascript.vim b/indent/javascript.vim index e072ad16..1bb59433 100644 --- a/indent/javascript.vim +++ b/indent/javascript.vim @@ -2,7 +2,7 @@ " Language: Javascript " Maintainer: Chris Paul ( https://github.com/bounceme ) " URL: https://github.com/pangloss/vim-javascript -" Last Change: December 10, 2016 +" Last Change: December 14, 2016 " Only load this indent file when no other was loaded. if exists('b:did_indent') @@ -106,11 +106,23 @@ endfunction " switch case label pattern let s:case_stmt = '\<\%(case\>\s*[^ \t:].*\|default\s*\):\C' +function s:label_end(ln,con) + return !cursor(a:ln,match(' '.a:con, '.*\zs' . s:case_stmt . '$')) && + \ (expand('') !=# 'default' || s:previous_token(1) !~ '[{,.]') +endfunction + " configurable regexes that define continuation lines, not including (, {, or [. let s:opfirst = '^' . get(g:,'javascript_opfirst', \ '\%([<>=,?^%|*/&]\|\([-.:+]\)\1\@!\|!=\|in\%(stanceof\)\=\>\)') let s:continuation = get(g:,'javascript_continuation', - \ '\%([<=,.~!?/*^%|&:]\|+\@\|\%(\.\s*\)\@\|\<\%(typeof\|delete\|void\|in\|instanceof\)\)') . '$' + +function s:continues(ln,con) + return !cursor(a:ln, match(' '.a:con,s:continuation)) && + \ eval((['s:syn_at(line("."),col(".")) !~? "regex"'] + + \ repeat(['s:previous_token() != "."'],5) + [1])[ + \ index(split('/ typeof in instanceof void delete'),s:token())]) +endfunction " get the line of code stripped of comments. if called with two args, leave " cursor at the last non-comment char. @@ -197,8 +209,7 @@ function s:IsBlock() elseif char == '>' return getline('.')[col('.')-2] == '=' || syn =~? '^jsflow' elseif char == ':' - return !cursor(0,match(' ' . strpart(getline('.'),0,col('.')),'.*\zs' . s:case_stmt . '$')) && - \ (expand('') !=# 'default' || s:previous_token(1) !~ '[{,.]') + return s:label_end(0,strpart(getline('.'),0,col('.'))) endif return syn =~? 'regex' || char !~ '[-=~!<*+,/?^%|&([]' endfunction @@ -278,14 +289,13 @@ function GetJavascriptIndent() endif if pline[-1:] != '.' && l:line =~# '^' . s:case_stmt return indent(num) + switch_offset - elseif pline =~# s:case_stmt . '$' + elseif s:label_end(l:lnum,pline) return indent(l:lnum) + s:W endif endif endif if pline[-1:] !~ '[{;]' - let isOp = l:line =~# s:opfirst || pline =~# s:continuation && - \ s:syn_at(l:lnum,match(' ' . pline,'\/$')) !~? 'regex' + let isOp = l:line =~# s:opfirst || s:continues(l:lnum,pline) let bL = s:iscontOne(l:lnum,num,isOp) let bL -= (bL && l:line[0] == '{') * s:W endif From f33b9ed81b5a07de1be786e9574454e0bddc62b7 Mon Sep 17 00:00:00 2001 From: Chris Paul Date: Tue, 20 Dec 2016 21:41:26 -0800 Subject: [PATCH 056/435] cleaning, edge case with keyword (#764) --- indent/javascript.vim | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/indent/javascript.vim b/indent/javascript.vim index 1bb59433..f5ddcbc4 100644 --- a/indent/javascript.vim +++ b/indent/javascript.vim @@ -2,7 +2,7 @@ " Language: Javascript " Maintainer: Chris Paul ( https://github.com/bounceme ) " URL: https://github.com/pangloss/vim-javascript -" Last Change: December 14, 2016 +" Last Change: December 20, 2016 " Only load this indent file when no other was loaded. if exists('b:did_indent') @@ -171,9 +171,9 @@ function s:OneScope(lnum) endif return index(split('for if let while with'),token) + 1 endif - return eval((['getline(".")[col(".")-2] == "="'] + - \ repeat(['s:previous_token(1) != "."'],2) + [0])[ - \ index(split('> else do'),s:token())]) + let token = s:token() + return token == '>' ? getline('.')[col('.')-2] == '=' : + \ token =~# '^\%(else\|do\)$' && s:previous_token(1) != '.' endfunction " returns braceless levels started by 'i' and above lines * &sw. 'num' is the @@ -205,7 +205,7 @@ function s:IsBlock() return char != '{' elseif char =~ '\k' return index(split('return const let import export yield default delete var void typeof throw new in instanceof') - \ ,char) < (0 + (line('.') != l:ln)) || s:previous_token() == '.' + \ ,char) < (line('.') != l:ln) || s:previous_token() == '.' elseif char == '>' return getline('.')[col('.')-2] == '=' || syn =~? '^jsflow' elseif char == ':' @@ -279,7 +279,7 @@ function GetJavascriptIndent() let pline = s:Trim(l:lnum) if num && s:looking_at() == ')' && s:GetPair('(', ')', 'bW', s:skip_expr, 100) > 0 let num = line('.') - if s:previous_token() ==# 'switch' + if s:previous_token() ==# 'switch' && s:previous_token() != '.' if &cino !~ ':' || !has('float') let switch_offset = s:W else From 1cb6f109418f4e18f569ee8953fc96c1e23b456f Mon Sep 17 00:00:00 2001 From: Chris Paul Date: Wed, 21 Dec 2016 10:55:06 -0800 Subject: [PATCH 057/435] cleaner loop (#765) --- indent/javascript.vim | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/indent/javascript.vim b/indent/javascript.vim index f5ddcbc4..d4e90d96 100644 --- a/indent/javascript.vim +++ b/indent/javascript.vim @@ -95,12 +95,18 @@ endfunction " NOTE: Moves the cursor, unless a arg is supplied. function s:previous_token(...) let l:pos = getpos('.')[1:2] - return [search('.\>\|[^[:alnum:][:space:]_$]','bW') ? - \ (s:looking_at() == '/' || line('.') != l:pos[0] && getline('.') =~ '\/\/') && - \ s:syn_at(line('.'),col('.')) =~? s:syng_com ? - \ search('\_[^/]\zs\/[/*]','bW') ? s:previous_token() : '' - \ : s:token() - \ : ''][a:0 && call('cursor',l:pos)] + let token = '' + while search('.\>\|[^[:alnum:][:space:]_$]','bW') + if (s:looking_at() == '/' || line('.') != l:pos[0] && search('\/\/','nbW', + \ line('.'))) && s:syn_at(line('.'),col('.')) =~? s:syng_com + call search('\_[^/]\zs\/[/*]','bW') + else + let token = s:token() + break + endif + endwhile + call call('cursor', a:0 ? l:pos : [0,0]) + return token endfunction " switch case label pattern From ce0f529bbb938b42f757aeedbe8f5d95f095b51d Mon Sep 17 00:00:00 2001 From: Chris Paul Date: Wed, 21 Dec 2016 15:12:52 -0800 Subject: [PATCH 058/435] refactor s:OneScope() (#766) --- indent/javascript.vim | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/indent/javascript.vim b/indent/javascript.vim index d4e90d96..53e0bd02 100644 --- a/indent/javascript.vim +++ b/indent/javascript.vim @@ -170,16 +170,16 @@ endfunction function s:OneScope(lnum) let pline = s:Trim(a:lnum,1) + let kw = 'else do' if pline[-1:] == ')' && s:GetPair('(', ')', 'bW', s:skip_expr, 100) > 0 - let token = s:previous_token() - if index(split('await each'),token) + 1 - return s:previous_token() ==# 'for' + call s:previous_token() + let kw = 'for if let while with' + if index(split('await each'),s:token()) + 1 + call s:previous_token() + let kw = 'for' endif - return index(split('for if let while with'),token) + 1 endif - let token = s:token() - return token == '>' ? getline('.')[col('.')-2] == '=' : - \ token =~# '^\%(else\|do\)$' && s:previous_token(1) != '.' + return pline[-2:] == '=>' || index(split(kw),s:token()) + 1 && s:previous_token(1) != '.' endfunction " returns braceless levels started by 'i' and above lines * &sw. 'num' is the From da1eee4452cb7acdfc4b495c46d51fe0507b68ff Mon Sep 17 00:00:00 2001 From: Chris Paul Date: Thu, 22 Dec 2016 16:29:44 -0800 Subject: [PATCH 059/435] odd comments, shebang (#768) basic support, other area's depend on syntax supporting this stuff --- indent/javascript.vim | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/indent/javascript.vim b/indent/javascript.vim index 53e0bd02..a7d3fdf2 100644 --- a/indent/javascript.vim +++ b/indent/javascript.vim @@ -145,7 +145,7 @@ endfunction " Find line above 'lnum' that isn't empty or in a comment function s:PrevCodeLine(lnum) let l:n = prevnonblank(a:lnum) - while getline(l:n) =~ '^\s*\/[/*]' || s:syn_at(l:n,1) =~? s:syng_com + while getline(l:n) =~ '^\s*\%(\/[/*]\|-->\|\|\|\|\|\|\|