From 5fea23eee943645dc648a98ae265ad209d5484ad Mon Sep 17 00:00:00 2001 From: bounceme Date: Thu, 31 Mar 2016 21:59:50 -0700 Subject: [PATCH 01/31] fast attempt for issues with multiple declarations --- indent/javascript.vim | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/indent/javascript.vim b/indent/javascript.vim index a39e1335..82cd621c 100644 --- a/indent/javascript.vim +++ b/indent/javascript.vim @@ -64,7 +64,7 @@ let s:continuation_regex = '\%([\\*+/.:]\|\%(<%\)\@\|\<\%(if\|for\|while\)\>\s*(.*)\)' . s:line_term From 293108695f704e70aeb86fb4d7596bce751c5701 Mon Sep 17 00:00:00 2001 From: bounceme Date: Sat, 9 Apr 2016 23:05:16 -0700 Subject: [PATCH 02/31] line following arrow indentation --- indent/javascript.vim | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/indent/javascript.vim b/indent/javascript.vim index a39e1335..f3a567f0 100644 --- a/indent/javascript.vim +++ b/indent/javascript.vim @@ -60,13 +60,13 @@ let s:skip_expr = "synIDattr(synID(line('.'),col('.'),1),'name') =~ '".s:syng_st let s:line_term = '\s*\%(\%(\/\/\).*\)\=$' " Regex that defines continuation lines, not including (, {, or [. -let s:continuation_regex = '\%([\\*+/.:]\|\%(<%\)\@].*,\)' . s:line_term " Regex that defines continuation lines. " TODO: this needs to deal with if ...: and so on let s:msl_regex = s:continuation_regex.'|'.s:expr_case -let s:one_line_scope_regex = '\%(\\|\<\%(if\|for\|while\)\>\s*(.*)\)' . s:line_term +let s:one_line_scope_regex = '\%(\%(\\|\<\%(if\|for\|while\)\>\s*(.*)\)\|=>\)' . s:line_term " Regex that defines blocks. let s:block_regex = '\%([{[]\)\s*\%(|\%([*@]\=\h\w*,\=\s*\)\%(,\s*[*@]\=\h\w*\)*|\)\=' . s:line_term From f286f94dcdb62ce8e5264aff641e3abe275daab0 Mon Sep 17 00:00:00 2001 From: Amadeus Demarzi Date: Sat, 9 Apr 2016 14:34:23 -0700 Subject: [PATCH 03/31] Fix lambda definitions in class definitions --- syntax/javascript.vim | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/syntax/javascript.vim b/syntax/javascript.vim index 0fa7130d..70b796fb 100644 --- a/syntax/javascript.vim +++ b/syntax/javascript.vim @@ -196,7 +196,7 @@ syntax cluster jsExpression contains=jsComment,jsLineComment,jsBlockComment,jsTa syntax cluster jsAll contains=@jsExpression,jsLabel,jsConditional,jsRepeat,jsReturn,jsStatement,jsTernaryIf,jsException syntax region jsBracket matchgroup=jsBrackets start="\[" end="\]" contains=@jsAll,jsParensErrB,jsParensErrC,jsBracket,jsParen,jsBlock,@htmlPreproc fold syntax region jsParen matchgroup=jsParens start="(" end=")" contains=@jsAll,jsOf,jsParensErrA,jsParensErrC,jsParen,jsBracket,jsBlock,@htmlPreproc fold -syntax region jsClassBlock matchgroup=jsClassBraces start="{" end="}" contains=jsFuncName,jsClassMethodDefinitions contained fold +syntax region jsClassBlock matchgroup=jsClassBraces start="{" end="}" contains=jsFuncName,jsClassMethodDefinitions,jsOperator,jsArrowFunction,jsArrowFuncArgs contained fold syntax region jsFuncBlock matchgroup=jsFuncBraces start="{" end="}" contains=@jsAll,jsParensErrA,jsParensErrB,jsParen,jsBracket,jsBlock,@htmlPreproc,jsClassDefinition fold syntax region jsBlock matchgroup=jsBraces start="{" end="}" contains=@jsAll,jsParensErrA,jsParensErrB,jsParen,jsBracket,jsBlock,jsObjectKey,@htmlPreproc,jsClassDefinition fold syntax region jsTernaryIf matchgroup=jsTernaryIfOperator start=+?+ end=+:+ contains=@jsExpression,jsTernaryIf From 734cdfc04eddf77e2d37c4f7291defff6334198b Mon Sep 17 00:00:00 2001 From: bounceme Date: Tue, 12 Apr 2016 11:02:15 -0700 Subject: [PATCH 04/31] Improve one line scope #293 this will detect the start and end parentheses,allowing statements with parentheses to come after the condition parens.This regex can detect with up to 4 levels of nesting. --- indent/javascript.vim | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/indent/javascript.vim b/indent/javascript.vim index 9ed79e4d..27249a8a 100644 --- a/indent/javascript.vim +++ b/indent/javascript.vim @@ -66,7 +66,7 @@ let s:continuation_regex = '\%([\\*+/.:]\|\%(<%\)\@\|\<\%(if\|for\|while\)\>\s*(.*)\)\|=>\)' . s:line_term +let s:one_line_scope_regex = '\%(\%(\\|\<\%(if\|for\|while\)\>\s*(\%([^()]*\|[^()]*(\%([^()]*\|[^()]*(\%([^()]*\|[^()]*([^()]*)[^()]*\))[^()]*\))[^()]*\))\)\|=>\)' . s:line_term " Regex that defines blocks. let s:block_regex = '\%([{[]\)\s*\%(|\%([*@]\=\h\w*,\=\s*\)\%(,\s*[*@]\=\h\w*\)*|\)\=' . s:line_term From f13009e4071c492f48fedc2afd9a07c046e17189 Mon Sep 17 00:00:00 2001 From: Amadeus Demarzi Date: Thu, 14 Apr 2016 14:57:40 -0700 Subject: [PATCH 05/31] Adding [ and ] to jsFuncArgDestructuring --- syntax/javascript.vim | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/syntax/javascript.vim b/syntax/javascript.vim index 70b796fb..b9f8fc98 100644 --- a/syntax/javascript.vim +++ b/syntax/javascript.vim @@ -222,7 +222,7 @@ syntax region jsFuncArgs contained matchgroup=jsFuncParens start='(' end syntax match jsFuncArgCommas contained ',' syntax match jsFuncArgRest contained /\%(\.\.\.[a-zA-Z_$][0-9a-zA-Z_$]*\))/ contains=jsFuncArgRestDots syntax match jsFuncArgRestDots contained /\.\.\./ -syntax match jsFuncArgDestructuring contained /\({\|}\|=\|:\|(\|)\)/ extend +syntax match jsFuncArgDestructuring contained /\({\|}\|=\|:\|(\|)\|\[\|\]\)/ extend " Matches a single keyword argument with no parens syntax match jsArrowFuncArgs /\(\k\)\+\s*\(=>\)\@=/ skipwhite contains=jsFuncArgs nextgroup=jsArrowFunction From 17fa18caeaa0c0f7df33a3a77ead1afebb9b29c1 Mon Sep 17 00:00:00 2001 From: bounceme Date: Fri, 15 Apr 2016 19:32:22 -0700 Subject: [PATCH 06/31] simplifies the parentheses handling also a possible fix for the last example in #329 and #315 --- indent/javascript.vim | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/indent/javascript.vim b/indent/javascript.vim index 9ed79e4d..217bf3bb 100644 --- a/indent/javascript.vim +++ b/indent/javascript.vim @@ -69,9 +69,9 @@ let s:msl_regex = s:continuation_regex.'\|'.s:expr_case let s:one_line_scope_regex = '\%(\%(\\|\<\%(if\|for\|while\)\>\s*(.*)\)\|=>\)' . s:line_term " Regex that defines blocks. -let s:block_regex = '\%([{[]\)\s*\%(|\%([*@]\=\h\w*,\=\s*\)\%(,\s*[*@]\=\h\w*\)*|\)\=' . s:line_term +let s:block_regex = '\%([{([]\)\s*\%(|\%([*@]\=\h\w*,\=\s*\)\%(,\s*[*@]\=\h\w*\)*|\)\=' . s:line_term -let s:var_stmt = '^\s*(const\|let\|var)' +let s:var_stmt = '^\s*\%(const\|let\|var\)' let s:comma_first = '^\s*,' let s:comma_last = ',\s*$' @@ -240,7 +240,7 @@ function s:LineHasOpeningBrackets(lnum) endif let pos = match(line, '[][(){}]', pos + 1) endwhile - return (open_0 > 0) . (open_2 > 0) . (open_4 > 0) + return (open_0 > 0 ? 1 : (open_0 == 0 ? 0 : 2)) . (open_2 > 0) . (open_4 > 0) endfunction function s:Match(lnum, regex) @@ -448,7 +448,19 @@ function GetJavascriptIndent() else call cursor(v:lnum, vcol) end - endif + elseif line =~ ')' || line =~ s:comma_last + let counts = s:LineHasOpeningBrackets(lnum) + if counts[0] == '2' + call cursor(lnum, 1) + " Search for the opening tag + let mnum = searchpair('(', '', ')', 'bW', s:skip_expr) + if mnum > 0 + return indent(s:GetMSL(mnum, 0)) + end + elseif line !~ s:var_stmt + return indent(prevline) + end + end " 3.4. Work on the MSL line. {{{2 " -------------------------- From 7d371ddeada2091a2bd32c0e1bb9e567731a8071 Mon Sep 17 00:00:00 2001 From: Amadeus Demarzi Date: Tue, 19 Apr 2016 12:44:08 -0700 Subject: [PATCH 07/31] Fixing comments in ES6 Class declarations --- syntax/javascript.vim | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/syntax/javascript.vim b/syntax/javascript.vim index b9f8fc98..6ff1a01c 100644 --- a/syntax/javascript.vim +++ b/syntax/javascript.vim @@ -196,7 +196,7 @@ syntax cluster jsExpression contains=jsComment,jsLineComment,jsBlockComment,jsTa syntax cluster jsAll contains=@jsExpression,jsLabel,jsConditional,jsRepeat,jsReturn,jsStatement,jsTernaryIf,jsException syntax region jsBracket matchgroup=jsBrackets start="\[" end="\]" contains=@jsAll,jsParensErrB,jsParensErrC,jsBracket,jsParen,jsBlock,@htmlPreproc fold syntax region jsParen matchgroup=jsParens start="(" end=")" contains=@jsAll,jsOf,jsParensErrA,jsParensErrC,jsParen,jsBracket,jsBlock,@htmlPreproc fold -syntax region jsClassBlock matchgroup=jsClassBraces start="{" end="}" contains=jsFuncName,jsClassMethodDefinitions,jsOperator,jsArrowFunction,jsArrowFuncArgs contained fold +syntax region jsClassBlock matchgroup=jsClassBraces start="{" end="}" contains=jsFuncName,jsClassMethodDefinitions,jsOperator,jsArrowFunction,jsArrowFuncArgs,jsComment,jsBlockComment,jsLineComment contained fold syntax region jsFuncBlock matchgroup=jsFuncBraces start="{" end="}" contains=@jsAll,jsParensErrA,jsParensErrB,jsParen,jsBracket,jsBlock,@htmlPreproc,jsClassDefinition fold syntax region jsBlock matchgroup=jsBraces start="{" end="}" contains=@jsAll,jsParensErrA,jsParensErrB,jsParen,jsBracket,jsBlock,jsObjectKey,@htmlPreproc,jsClassDefinition fold syntax region jsTernaryIf matchgroup=jsTernaryIfOperator start=+?+ end=+:+ contains=@jsExpression,jsTernaryIf From 3208fc5d6ce9ae676cb0b97400a7b7a7efa9704b Mon Sep 17 00:00:00 2001 From: bounceme Date: Tue, 19 Apr 2016 19:54:44 -0700 Subject: [PATCH 08/31] Operator first support,including ternary,dot etc. the previous pr is being difficult, sorry --- indent/javascript.vim | 40 ++++++++++++++++++++++++++++++++-------- 1 file changed, 32 insertions(+), 8 deletions(-) diff --git a/indent/javascript.vim b/indent/javascript.vim index 217bf3bb..71c08017 100644 --- a/indent/javascript.vim +++ b/indent/javascript.vim @@ -71,14 +71,13 @@ let s:one_line_scope_regex = '\%(\%(\\|\<\%(if\|for\|while\)\>\s*(.*)\)\| " Regex that defines blocks. let s:block_regex = '\%([{([]\)\s*\%(|\%([*@]\=\h\w*,\=\s*\)\%(,\s*[*@]\=\h\w*\)*|\)\=' . s:line_term +let s:operator_first = '^\s*\%([-*/+.:?]\|||\|&&\)' + let s:var_stmt = '^\s*\%(const\|let\|var\)' let s:comma_first = '^\s*,' let s:comma_last = ',\s*$' -let s:ternary = '^\s\+[?|:]' -let s:ternary_q = '^\s\+?' - let s:case_indent = s:sw() let s:case_indent_after = s:sw() let s:m = matchlist(&cinoptions, ':\(.\)') @@ -378,13 +377,38 @@ function GetJavascriptIndent() return indent(prevline) + s:case_indent_after endif - if (line =~ s:ternary) - if (getline(prevline) =~ s:ternary_q) + " If line starts with an operator... + if (s:Match(v:lnum, s:operator_first)) + if (s:Match(prevline, s:operator_first)) + " and so does previous line, don't indent return indent(prevline) - else + end + let counts = s:LineHasOpeningBrackets(prevline) + if counts[0] == '2' + call cursor(prevline, 1) + " Search for the opening tag + let mnum = searchpair('(', '', ')', 'bW', s:skip_expr) + if mnum > 0 && s:Match(mnum, s:operator_first) + return indent(mnum) + end + elseif counts[0] != '1' && counts[1] != '1' && counts[2] != '1' + " otherwise, indent 1 level return indent(prevline) + s:sw() - endif - endif + end + " If previous line starts with an operator... + elseif s:Match(prevline, s:operator_first) && !s:Match(prevline, s:comma_last) + let counts = s:LineHasOpeningBrackets(prevline) + if counts[0] == '2' && counts[1] == '1' + call cursor(prevline, 1) + " Search for the opening tag + let mnum = searchpair('(', '', ')', 'bW', s:skip_expr) + if mnum > 0 && !s:Match(mnum, s:operator_first) + return indent(mnum) + s:sw() + end + elseif counts[0] != '1' && counts[1] != '1' && counts[2] != '1' + return indent(prevline) - s:sw() + end + end " If we are in a multi-line comment, cindent does the right thing. if s:IsInMultilineComment(v:lnum, 1) && !s:IsLineComment(v:lnum, 1) From 992b76dc5d1c21cc4689b7d069edaa4c077735fe Mon Sep 17 00:00:00 2001 From: Amadeus Demarzi Date: Sun, 17 Apr 2016 21:11:27 -0700 Subject: [PATCH 09/31] Temporarily disabled jsArrowFuncArgs with parens This is until we can figure out how to properly match all the crazy use cases. --- syntax/javascript.vim | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/syntax/javascript.vim b/syntax/javascript.vim index 6ff1a01c..de7be809 100644 --- a/syntax/javascript.vim +++ b/syntax/javascript.vim @@ -227,7 +227,7 @@ syntax match jsFuncArgDestructuring contained /\({\|}\|=\|:\|(\|)\|\[\|\]\)/ e " Matches a single keyword argument with no parens syntax match jsArrowFuncArgs /\(\k\)\+\s*\(=>\)\@=/ skipwhite contains=jsFuncArgs nextgroup=jsArrowFunction " Matches a series of arguments surrounded in parens -syntax match jsArrowFuncArgs /(\%(.\)*)\s*\(=>\)\@=/ skipempty skipwhite contains=jsFuncArgs nextgroup=jsArrowFunction +" syntax match jsArrowFuncArgs /(\%(.\)*)\s*\(=>\)\@=/ skipempty skipwhite contains=jsFuncArgs nextgroup=jsArrowFunction syntax keyword jsClassKeywords extends class contained syntax match jsClassNoise /\./ contained From 16673accd3c491be227cb9e22a0fef33cc812521 Mon Sep 17 00:00:00 2001 From: Amadeus Demarzi Date: Wed, 20 Apr 2016 14:24:01 -0700 Subject: [PATCH 10/31] Adding a license note to the README I basically just copied what Tim Pope has done for his projects, an example can be seen here: https://github.com/tpope/vim-pathogen#license --- README.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/README.md b/README.md index 797c89e4..1ad4078c 100644 --- a/README.md +++ b/README.md @@ -91,3 +91,7 @@ proposed change and how it is valuable. ## Bug report 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 6cb0c96b66c1c2554ba0ebd8ead7f9ac938ce49a Mon Sep 17 00:00:00 2001 From: bounceme Date: Wed, 20 Apr 2016 17:04:57 -0700 Subject: [PATCH 11/31] old changes reset --- indent/javascript.vim | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/indent/javascript.vim b/indent/javascript.vim index 82cd621c..c3d331ce 100644 --- a/indent/javascript.vim +++ b/indent/javascript.vim @@ -43,7 +43,10 @@ endif let s:js_keywords = '^\s*\(break\|catch\|const\|continue\|debugger\|delete\|do\|else\|finally\|for\|function\|if\|in\|instanceof\|let\|new\|return\|switch\|this\|throw\|try\|typeof\|var\|void\|while\|with\)' let s:expr_case = '^\s*\(case\s\+[^\:]*\|default\)\s*:\s*' " Regex of syntax group names that are or delimit string or are comments. -let s:syng_strcom = 'string\|regex\|comment\c' +let s:syng_strcom = '\%(\%(template\)\@ Date: Thu, 21 Apr 2016 16:31:06 -0700 Subject: [PATCH 12/31] #324 This should work --- indent/javascript.vim | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/indent/javascript.vim b/indent/javascript.vim index 5dfdc6ca..05713a33 100644 --- a/indent/javascript.vim +++ b/indent/javascript.vim @@ -119,13 +119,13 @@ function s:PrevNonBlankNonString(lnum) " Go in and out of blocks comments as necessary. " If the line isn't empty (with opt. comment) or in a string, end search. let line = getline(lnum) - if line =~ '/\*' + if s:IsInMultilineComment(lnum, matchend(line, '/\*') - 1) if in_block let in_block = 0 else break endif - elseif !in_block && line =~ '\*/' + elseif !in_block && s:IsInMultilineComment(lnum, matchend(line, '\*/') - 1) let in_block = 1 elseif !in_block && line !~ '^\s*\%(//\).*$' && !(s:IsInStringOrComment(lnum, 1) && s:IsInStringOrComment(lnum, strlen(line))) break From b9feef0864cfd77822ace829267b91c33df7c34f Mon Sep 17 00:00:00 2001 From: Amadeus Demarzi Date: Sun, 17 Apr 2016 21:20:44 -0700 Subject: [PATCH 13/31] Improved lambda argument handling --- syntax/javascript.vim | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/syntax/javascript.vim b/syntax/javascript.vim index de7be809..d3af0a12 100644 --- a/syntax/javascript.vim +++ b/syntax/javascript.vim @@ -195,10 +195,10 @@ endif "DOM/HTML/CSS syntax cluster jsExpression contains=jsComment,jsLineComment,jsBlockComment,jsTaggedTemplate,jsTemplateString,jsStringD,jsStringS,jsRegexpString,jsNumber,jsFloat,jsThis,jsStatic,jsSuper,jsOperator,jsBooleanTrue,jsBooleanFalse,jsNull,jsFunction,jsArrowFunction,jsGlobalObjects,jsExceptions,jsFutureKeys,jsDomErrNo,jsDomNodeConsts,jsHtmlEvents,jsDotNotation,jsBracket,jsParen,jsBlock,jsFuncCall,jsUndefined,jsNan,jsKeyword,jsStorageClass,jsPrototype,jsBuiltins,jsNoise,jsCommonJS,jsAssignmentExpr,jsImportContainer,jsExportContainer,jsArgsObj,jsDecorator,jsAsyncKeyword,jsClassDefinition,jsArrowFunction,jsArrowFuncArgs syntax cluster jsAll contains=@jsExpression,jsLabel,jsConditional,jsRepeat,jsReturn,jsStatement,jsTernaryIf,jsException syntax region jsBracket matchgroup=jsBrackets start="\[" end="\]" contains=@jsAll,jsParensErrB,jsParensErrC,jsBracket,jsParen,jsBlock,@htmlPreproc fold -syntax region jsParen matchgroup=jsParens start="(" end=")" contains=@jsAll,jsOf,jsParensErrA,jsParensErrC,jsParen,jsBracket,jsBlock,@htmlPreproc fold +syntax region jsParen matchgroup=jsParens start="(" end=")" contains=@jsAll,jsOf,jsParensErrA,jsParensErrC,jsParen,jsBracket,jsBlock,@htmlPreproc fold extend syntax region jsClassBlock matchgroup=jsClassBraces start="{" end="}" contains=jsFuncName,jsClassMethodDefinitions,jsOperator,jsArrowFunction,jsArrowFuncArgs,jsComment,jsBlockComment,jsLineComment contained fold -syntax region jsFuncBlock matchgroup=jsFuncBraces start="{" end="}" contains=@jsAll,jsParensErrA,jsParensErrB,jsParen,jsBracket,jsBlock,@htmlPreproc,jsClassDefinition fold -syntax region jsBlock matchgroup=jsBraces start="{" end="}" contains=@jsAll,jsParensErrA,jsParensErrB,jsParen,jsBracket,jsBlock,jsObjectKey,@htmlPreproc,jsClassDefinition fold +syntax region jsFuncBlock matchgroup=jsFuncBraces start="{" end="}" contains=@jsAll,jsParensErrA,jsParensErrB,jsParen,jsBracket,jsBlock,@htmlPreproc,jsClassDefinition fold extend +syntax region jsBlock matchgroup=jsBraces start="{" end="}" contains=@jsAll,jsParensErrA,jsParensErrB,jsParen,jsBracket,jsBlock,jsObjectKey,@htmlPreproc,jsClassDefinition fold extend syntax region jsTernaryIf matchgroup=jsTernaryIfOperator start=+?+ end=+:+ contains=@jsExpression,jsTernaryIf "" catch errors caused by wrong parenthesis @@ -213,21 +213,21 @@ if main_syntax == "javascript" syntax sync match jsHighlight grouphere jsBlock /{/ endif +syntax match jsFuncArgDestructuring contained /\({\|}\|=\|:\|\[\|\]\)/ extend exe 'syntax match jsFunction /\/ nextgroup=jsGenerator,jsFuncName,jsFuncArgs skipwhite '.(exists('g:javascript_conceal_function') ? 'conceal cchar='.g:javascript_conceal_function : '') exe 'syntax match jsArrowFunction /=>/ skipwhite nextgroup=jsFuncBlock contains=jsFuncBraces '.(exists('g:javascript_conceal_arrow_function') ? 'conceal cchar='.g:javascript_conceal_arrow_function : '') syntax match jsGenerator contained '\*' nextgroup=jsFuncName,jsFuncArgs skipwhite syntax match jsFuncName contained /\<[a-zA-Z_$][0-9a-zA-Z_$]*/ nextgroup=jsFuncArgs skipwhite -syntax region jsFuncArgs contained matchgroup=jsFuncParens start='(' end=')' contains=jsFuncArgCommas,jsFuncArgRest,jsComment,jsLineComment,jsStringS,jsStringD,jsNumber,jsFuncArgDestructuring nextgroup=jsFuncBlock keepend skipwhite skipempty +syntax region jsFuncArgs contained matchgroup=jsFuncParens start='(' end=')' contains=jsFuncArgCommas,jsFuncArgRest,jsComment,jsLineComment,jsStringS,jsStringD,jsNumber,jsFuncArgDestructuring,jsArrowFunction,jsParen,jsArrowFuncArgs nextgroup=jsFuncBlock keepend skipwhite skipempty syntax match jsFuncArgCommas contained ',' syntax match jsFuncArgRest contained /\%(\.\.\.[a-zA-Z_$][0-9a-zA-Z_$]*\))/ contains=jsFuncArgRestDots syntax match jsFuncArgRestDots contained /\.\.\./ -syntax match jsFuncArgDestructuring contained /\({\|}\|=\|:\|(\|)\|\[\|\]\)/ extend " Matches a single keyword argument with no parens -syntax match jsArrowFuncArgs /\(\k\)\+\s*\(=>\)\@=/ skipwhite contains=jsFuncArgs nextgroup=jsArrowFunction +syntax match jsArrowFuncArgs /\(\k\)\+\s*\(=>\)\@=/ skipwhite contains=jsFuncArgs nextgroup=jsArrowFunction extend " Matches a series of arguments surrounded in parens -" syntax match jsArrowFuncArgs /(\%(.\)*)\s*\(=>\)\@=/ skipempty skipwhite contains=jsFuncArgs nextgroup=jsArrowFunction +syntax match jsArrowFuncArgs /([^()]*)\s*\(=>\)\@=/ skipempty skipwhite contains=jsFuncArgs nextgroup=jsArrowFunction extend syntax keyword jsClassKeywords extends class contained syntax match jsClassNoise /\./ contained From a607a7d36012c16e45040f105fad2162b992a101 Mon Sep 17 00:00:00 2001 From: bounceme Date: Wed, 20 Apr 2016 18:59:41 -0700 Subject: [PATCH 14/31] spanning multiple lines detection In progress but here are the effects so far ``` if ( a == b && c == d && e == f || g == h || i == j ) { a = b + c - d; } ``` as opposed to this which would indent everything following it: ``` if ( a == b && c == d && e == f || g == h || i == j ) { a = b + c - d; } ``` --- indent/javascript.vim | 27 +++++++++++++++++++++++---- 1 file changed, 23 insertions(+), 4 deletions(-) diff --git a/indent/javascript.vim b/indent/javascript.vim index 5dfdc6ca..ca0ded20 100644 --- a/indent/javascript.vim +++ b/indent/javascript.vim @@ -145,9 +145,21 @@ function s:GetMSL(lnum, in_one_line_scope) " Otherwise, terminate search as we have found our MSL already. let line = getline(lnum) let col = match(line, s:msl_regex) + 1 + let line2 = getline(msl) + let col2 = matchend(line2, ')') if (col > 0 && !s:IsInStringOrComment(lnum, col)) || s:IsInString(lnum, strlen(line)) let msl = lnum + + " if there are more closing brackets, continue from the line which has the matching opening bracket + elseif col2 > 0 && !s:IsInStringOrComment(msl, col2) && s:LineHasOpeningBrackets(msl)[0] == '2' + call cursor(msl, 1) + if searchpair('(', '', ')', 'bW', s:skip_expr) > 0 + let lnum = line('.') + let msl = lnum + endif + else + " Don't use lines that are part of a one line scope as msl unless the " flag in_one_line_scope is set to 1 " @@ -158,7 +170,7 @@ function s:GetMSL(lnum, in_one_line_scope) if msl_one_line == 0 break endif - endif + end let lnum = s:PrevNonBlankNonString(lnum - 1) endwhile return msl @@ -396,7 +408,7 @@ function GetJavascriptIndent() return indent(prevline) + s:sw() end " If previous line starts with an operator... - elseif s:Match(prevline, s:operator_first) && !s:Match(prevline, s:comma_last) + elseif s:Match(prevline, s:operator_first) && !s:Match(prevline, s:comma_last) && !s:Match(prevline, '};\=' . s:line_term) let counts = s:LineHasOpeningBrackets(prevline) if counts[0] == '2' && counts[1] == '1' call cursor(prevline, 1) @@ -472,7 +484,14 @@ function GetJavascriptIndent() else call cursor(v:lnum, vcol) end - elseif line =~ ')' || line =~ s:comma_last + elseif line =~ '.\+};\=' . s:line_term + call cursor(lnum, 1) + " Search for the opening tag + let mnum = searchpair('{', '', '}', 'bW', s:skip_expr) + if mnum > 0 + return indent(s:GetMSL(mnum, 0)) + end + elseif line =~ '.\+);\=' || line =~ s:comma_last let counts = s:LineHasOpeningBrackets(lnum) if counts[0] == '2' call cursor(lnum, 1) @@ -481,7 +500,7 @@ function GetJavascriptIndent() if mnum > 0 return indent(s:GetMSL(mnum, 0)) end - elseif line !~ s:var_stmt + elseif line !~ s:var_stmt return indent(prevline) end end From 1da09b62272c3860c2a9119d5081041de034d381 Mon Sep 17 00:00:00 2001 From: Amadeus Demarzi Date: Fri, 22 Apr 2016 16:05:45 -0700 Subject: [PATCH 15/31] Move jsDocTag @file to a different jsDocTag group Apparently there is no `nextgroup` match for the @file type. Fixes #341 --- syntax/javascript.vim | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/syntax/javascript.vim b/syntax/javascript.vim index d3af0a12..4624c718 100644 --- a/syntax/javascript.vim +++ b/syntax/javascript.vim @@ -63,7 +63,7 @@ if !exists("javascript_ignore_javaScriptdoc") syntax region jsBlockComment matchgroup=jsComment start="/\*\s*" end="\*/" contains=jsDocTags,jsCommentTodo,jsCvsTag,@jsHtml,@Spell fold " tags containing a param - syntax match jsDocTags contained "@\(alias\|api\|augments\|borrows\|class\|constructs\|default\|defaultvalue\|emits\|exception\|exports\|extends\|file\|fires\|kind\|link\|listens\|member\|member[oO]f\|mixes\|module\|name\|namespace\|requires\|template\|throws\|var\|variation\|version\)\>" nextgroup=jsDocParam skipwhite + syntax match jsDocTags contained "@\(alias\|api\|augments\|borrows\|class\|constructs\|default\|defaultvalue\|emits\|exception\|exports\|extends\|fires\|kind\|link\|listens\|member\|member[oO]f\|mixes\|module\|name\|namespace\|requires\|template\|throws\|var\|variation\|version\)\>" nextgroup=jsDocParam skipwhite " tags containing type and param syntax match jsDocTags contained "@\(arg\|argument\|cfg\|param\|property\|prop\)\>" nextgroup=jsDocType skipwhite " tags containing type but no param @@ -71,7 +71,7 @@ if !exists("javascript_ignore_javaScriptdoc") " tags containing references syntax match jsDocTags contained "@\(lends\|see\|tutorial\)\>" nextgroup=jsDocSeeTag skipwhite " other tags (no extra syntax) - syntax match jsDocTags contained "@\(abstract\|access\|accessor\|author\|classdesc\|constant\|const\|constructor\|copyright\|deprecated\|desc\|description\|dict\|event\|example\|file[oO]verview\|final\|function\|global\|ignore\|inheritDoc\|inner\|instance\|interface\|license\|localdoc\|method\|mixin\|nosideeffects\|override\|overview\|preserve\|private\|protected\|public\|readonly\|since\|static\|struct\|todo\|summary\|undocumented\|virtual\)\>" + syntax match jsDocTags contained "@\(abstract\|access\|accessor\|author\|classdesc\|constant\|const\|constructor\|copyright\|deprecated\|desc\|description\|dict\|event\|example\|file\|file[oO]verview\|final\|function\|global\|ignore\|inheritDoc\|inner\|instance\|interface\|license\|localdoc\|method\|mixin\|nosideeffects\|override\|overview\|preserve\|private\|protected\|public\|readonly\|since\|static\|struct\|todo\|summary\|undocumented\|virtual\)\>" syntax region jsDocType start="{" end="}" oneline contained nextgroup=jsDocParam skipwhite syntax match jsDocType contained "\%(#\|\"\|\w\|\.\|:\|\/\)\+" nextgroup=jsDocParam skipwhite From af37b2253c975c6608992d3ece93b02314b604c5 Mon Sep 17 00:00:00 2001 From: bounceme Date: Sun, 24 Apr 2016 09:44:06 -0700 Subject: [PATCH 16/31] [-+] not by another --- indent/javascript.vim | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/indent/javascript.vim b/indent/javascript.vim index 2d7f3524..cadd33cf 100644 --- a/indent/javascript.vim +++ b/indent/javascript.vim @@ -63,7 +63,7 @@ let s:skip_expr = "synIDattr(synID(line('.'),col('.'),1),'name') =~ '".s:syng_st let s:line_term = '\s*\%(\%(\/\/\).*\)\=$' " Regex that defines continuation lines, not including (, {, or [. -let s:continuation_regex = '\%([\\*+/.:]\|\%(<%\)\@].*,\)' . s:line_term +let s:continuation_regex = '\%([\\*/.:]\|+\@].*,\)' . s:line_term " Regex that defines continuation lines. " TODO: this needs to deal with if ...: and so on @@ -74,7 +74,7 @@ let s:one_line_scope_regex = '\%(\%(\\|\<\%(if\|for\|while\)\>\s*(\%([^() " Regex that defines blocks. let s:block_regex = '\%([{([]\)\s*\%(|\%([*@]\=\h\w*,\=\s*\)\%(,\s*[*@]\=\h\w*\)*|\)\=' . s:line_term -let s:operator_first = '^\s*\%([-*/+.:?]\|||\|&&\)' +let s:operator_first = '^\s*\%([*/.:?]\|\([-+]\)\1\@!\|||\|&&\)' let s:var_stmt = '^\s*\%(const\|let\|var\)' From f7cec8c79798e8d79f2bf95fe1a5f4eee44086bf Mon Sep 17 00:00:00 2001 From: Amadeus Demarzi Date: Thu, 21 Apr 2016 22:13:25 -0700 Subject: [PATCH 17/31] Fixing bizarre jsDocParam bug --- syntax/javascript.vim | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/syntax/javascript.vim b/syntax/javascript.vim index 4624c718..10d15689 100644 --- a/syntax/javascript.vim +++ b/syntax/javascript.vim @@ -77,7 +77,7 @@ if !exists("javascript_ignore_javaScriptdoc") syntax match jsDocType contained "\%(#\|\"\|\w\|\.\|:\|\/\)\+" nextgroup=jsDocParam skipwhite syntax region jsDocTypeNoParam start="{" end="}" oneline contained syntax match jsDocTypeNoParam contained "\%(#\|\"\|\w\|\.\|:\|\/\)\+" - syntax match jsDocParam contained "\%(#\|\$\|-\|'\|\"\|{\|}\|\w\|\.\|:\|\/\|\[\|]\|=\)\+" + syntax match jsDocParam contained "\%(#\|\$\|-\|'\|\"\|{.\{-}}\|\w\|\.\|:\|\/\|\[.{-}]\|=\)\+" syntax region jsDocSeeTag contained matchgroup=jsDocSeeTag start="{" end="}" contains=jsDocTags syntax case match From e74d7582248949f605af9098b90222d19d56b546 Mon Sep 17 00:00:00 2001 From: Amadeus Demarzi Date: Sun, 24 Apr 2016 12:13:21 -0700 Subject: [PATCH 18/31] Refactored README.md * De-prioritized the not on regexes * Added vim-plug installation instructions * Improved header hierarchy * Improved configuration variables documentation * Removed some deprecated instructions * Tweaks misc content --- README.md | 67 ++++++++++++++++++++++++++++++++----------------------- 1 file changed, 39 insertions(+), 28 deletions(-) diff --git a/README.md b/README.md index 1ad4078c..f5459983 100644 --- a/README.md +++ b/README.md @@ -1,68 +1,64 @@ # vim-javascript v0.10.0 -JavaScript bundle for vim, this bundle provides syntax and indent plugins. +JavaScript bundle for vim, this bundle provides syntax highlighting and +improved indentation. -## A Quick Note on Regexes -Vim 7.4 was released recently, and unfortunately broke how this plugin -handles regexes. There was no real easy way for us to fix this unless we -completely rewrote how regexes work. +## Installation -Good News: There was a recent update to Vim 7.4 that fixes this issue. +### Install with [Vundle](https://github.com/gmarik/vundle) -Make sure you are at least using Vim 7.4, with patches 1-7. +Add to vimrc: -If you are stuck on an older version of Vim 7.4 with no way to update, -then simply perform the following commands to fix your current buffer: + Plugin 'pangloss/vim-javascript' -``` -:set regexpengine=1 -:syntax enable -``` +And install it: -## Installation + :so ~/.vimrc + :PluginInstall -### Install with [Vundle](https://github.com/gmarik/vundle) +### Install with [vim-plug](https://github.com/junegunn/vim-plug) Add to vimrc: - Plugin 'pangloss/vim-javascript' + Plug 'pangloss/vim-javascript' And install it: :so ~/.vimrc - :PluginInstall + :PlugInstall ### Install with [pathogen](https://github.com/tpope/vim-pathogen) cd ~/.vim/bundle git clone https://github.com/pangloss/vim-javascript.git -## Configuration + +## Configuration Variables The following variables control certain syntax highlighting features. You can add them to your `.vimrc` to enable/disable their features. -#### javascript_enable_domhtmlcss +``` +let g:javascript_enable_domhtmlcss = 1 +``` Enables HTML/CSS syntax highlighting in your JavaScript file. Default Value: 0 -#### b:javascript_fold +----------------- -Enables JavaScript code folding. - -Default Value: 1 - - -#### javascript_ignore_javaScriptdoc +``` +let g:javascript_ignore_javaScriptdoc = 1 +``` Disables JSDoc syntax highlighting Default Value: 0 -#### Concealing Characters + +## Concealing Characters You can customize concealing characters by defining one or more of the following variables: @@ -78,6 +74,7 @@ variables: let g:javascript_conceal_super = "Ω" let g:javascript_conceal_arrow_function = "⇒" + ## Contributing This project uses the [git @@ -88,10 +85,24 @@ 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. -## Bug report + +## Bug Reports Report a bug on [GitHub Issues](https://github.com/pangloss/vim-javascript/issues). + +## A Quick Note on Regexes + +Vim 7.4 with patches LESS than 1-7 exhibits a bug that broke how we handle +javascript regexes. Please update to a newer version or run the following +commands to fix: + +``` +:set regexpengine=1 +:syntax enable +``` + + ## License Distributed under the same terms as Vim itself. See `:help license`. From 2f0b1d266f396aed09d06c87ec5533974d6e4994 Mon Sep 17 00:00:00 2001 From: Amadeus Demarzi Date: Sun, 24 Apr 2016 12:14:25 -0700 Subject: [PATCH 19/31] Removing deprecated folding logic b:javascript_fold is no longer used anymore. Folding is done through `set foldmethod=syntax` --- syntax/javascript.vim | 6 ------ 1 file changed, 6 deletions(-) diff --git a/syntax/javascript.vim b/syntax/javascript.vim index 10d15689..9a6933e3 100644 --- a/syntax/javascript.vim +++ b/syntax/javascript.vim @@ -16,12 +16,6 @@ if !exists('g:javascript_conceal') let g:javascript_conceal = 0 endif -"" Drop fold if it is set but VIM doesn't support it. -let b:javascript_fold='true' -if version < 600 " Don't support the old version - unlet! b:javascript_fold -endif - "" dollar sign is permittd anywhere in an identifier setlocal iskeyword+=$ From 48067d6dc9eb2361b24d4fc3c3a4f87303c7c007 Mon Sep 17 00:00:00 2001 From: Amadeus Demarzi Date: Sun, 24 Apr 2016 12:16:38 -0700 Subject: [PATCH 20/31] Add code folding documentation --- README.md | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/README.md b/README.md index f5459983..617df9f1 100644 --- a/README.md +++ b/README.md @@ -57,6 +57,17 @@ Disables JSDoc syntax highlighting Default Value: 0 +----------------- + +``` +set foldmethod=syntax +``` + +Enables code folding based on our syntax file. + +Please note this can have a dramatic effect on performance and because it is a +global vim option, we do not set it ourselves. + ## Concealing Characters From a51d0f3c4057bfd05c8695fdb5cfec79a0dfe9f5 Mon Sep 17 00:00:00 2001 From: bounceme Date: Sun, 24 Apr 2016 13:00:38 -0700 Subject: [PATCH 21/31] Update javascript.vim https://github.com/pangloss/vim-javascript/pull/367#issuecomment-214022633 --- indent/javascript.vim | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/indent/javascript.vim b/indent/javascript.vim index cadd33cf..80778907 100644 --- a/indent/javascript.vim +++ b/indent/javascript.vim @@ -159,7 +159,7 @@ function s:GetMSL(lnum, in_one_line_scope) let msl = lnum " if there are more closing brackets, continue from the line which has the matching opening bracket - elseif col2 > 0 && !s:IsInStringOrComment(msl, col2) && s:LineHasOpeningBrackets(msl)[0] == '2' + elseif col2 > 0 && !s:IsInStringOrComment(msl, col2) && s:LineHasOpeningBrackets(msl)[0] == '2' && !a:in_one_line_scope call cursor(msl, 1) if searchpair('(', '', ')', 'bW', s:skip_expr) > 0 let lnum = line('.') @@ -490,12 +490,12 @@ function GetJavascriptIndent() if line =~ '[[({]' let counts = s:LineHasOpeningBrackets(lnum) if counts[0] == '1' && searchpair('(', '', ')', 'bW', s:skip_expr) > 0 - if col('.') + 1 == col('$') + if col('.') + 1 == col('$') || line =~ s:one_line_scope_regex return ind + s:sw() else return virtcol('.') endif - elseif counts[1] == '1' || counts[2] == '1' + elseif counts[1] == '1' || counts[2] == '1' && counts[0] != '2' return ind + s:sw() else call cursor(v:lnum, vcol) From 1c75d8a3c61de3c97edae7070ba3656974600a34 Mon Sep 17 00:00:00 2001 From: Amadeus Demarzi Date: Sun, 24 Apr 2016 11:38:42 -0700 Subject: [PATCH 22/31] Fix JSDoc record matching This should fix #320 --- syntax/javascript.vim | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/syntax/javascript.vim b/syntax/javascript.vim index 9a6933e3..ca615470 100644 --- a/syntax/javascript.vim +++ b/syntax/javascript.vim @@ -67,8 +67,10 @@ if !exists("javascript_ignore_javaScriptdoc") " other tags (no extra syntax) syntax match jsDocTags contained "@\(abstract\|access\|accessor\|author\|classdesc\|constant\|const\|constructor\|copyright\|deprecated\|desc\|description\|dict\|event\|example\|file\|file[oO]verview\|final\|function\|global\|ignore\|inheritDoc\|inner\|instance\|interface\|license\|localdoc\|method\|mixin\|nosideeffects\|override\|overview\|preserve\|private\|protected\|public\|readonly\|since\|static\|struct\|todo\|summary\|undocumented\|virtual\)\>" - syntax region jsDocType start="{" end="}" oneline contained nextgroup=jsDocParam skipwhite + syntax region jsDocType matchgroup=jsDocTypeBrackets start="{" end="}" oneline contained nextgroup=jsDocParam skipwhite contains=jsDocTypeRecord syntax match jsDocType contained "\%(#\|\"\|\w\|\.\|:\|\/\)\+" nextgroup=jsDocParam skipwhite + syntax region jsDocTypeRecord start=/{/ end=/}/ contained extend contains=jsDocTypeRecord + syntax region jsDocTypeRecord start=/\[/ end=/\]/ contained extend contains=jsDocTypeRecord syntax region jsDocTypeNoParam start="{" end="}" oneline contained syntax match jsDocTypeNoParam contained "\%(#\|\"\|\w\|\.\|:\|\/\)\+" syntax match jsDocParam contained "\%(#\|\$\|-\|'\|\"\|{.\{-}}\|\w\|\.\|:\|\/\|\[.{-}]\|=\)\+" @@ -248,6 +250,8 @@ if version >= 508 || !exists("did_javascript_syn_inits") HiLink jsDocTags Special HiLink jsDocSeeTag Function HiLink jsDocType Type + HiLink jsDocTypeBrackets jsDocType + HiLink jsDocTypeRecord jsDocType HiLink jsDocTypeNoParam Type HiLink jsDocParam Label HiLink jsStringS String From a7f221678a912ad44654b013770338dc80df7c16 Mon Sep 17 00:00:00 2001 From: Amadeus Demarzi Date: Thu, 21 Apr 2016 18:12:34 -0700 Subject: [PATCH 23/31] Optimize JSNoise and JSOperator regexes Not using groups seems to help a bunch with performance --- syntax/javascript.vim | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/syntax/javascript.vim b/syntax/javascript.vim index ca615470..5635d11e 100644 --- a/syntax/javascript.vim +++ b/syntax/javascript.vim @@ -21,12 +21,12 @@ setlocal iskeyword+=$ syntax sync fromstart -syntax match jsNoise /\%(:\|,\|\;\|\.\)/ +syntax match jsNoise /[:,\;\.]\{1}/ "" Program Keywords syntax keyword jsStorageClass const var let syntax keyword jsOperator delete instanceof typeof void new in -syntax match jsOperator /\(!\||\|&\|+\|-\|<\|>\|=\|%\|\/\|*\|\~\|\^\)/ +syntax match jsOperator /[\!\|\&\+\-\<\>\=\%\/\*\~\^]\{1}/ syntax keyword jsBooleanTrue true syntax keyword jsBooleanFalse false syntax keyword jsModules import export contained From 01ecaf9ab2640e13e4708b00f9eb2173a18de712 Mon Sep 17 00:00:00 2001 From: Amadeus Demarzi Date: Thu, 21 Apr 2016 18:14:02 -0700 Subject: [PATCH 24/31] Removing deprecated selectors I think these matchers where for functions, and from another era of project ownership. They added a TON of performance overhead, and I could never replicate a scenario where they matched. --- syntax/javascript.vim | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/syntax/javascript.vim b/syntax/javascript.vim index 5635d11e..1ff8bda9 100644 --- a/syntax/javascript.vim +++ b/syntax/javascript.vim @@ -36,7 +36,7 @@ syntax keyword jsArgsObj arguments syntax region jsImportContainer start="^\s\?import \?" end=";\|$" contains=jsModules,jsModuleWords,jsLineComment,jsComment,jsStringS,jsStringD,jsTemplateString,jsNoise,jsBlock -syntax region jsExportContainer start="^\s\?export \?" end="$" contains=jsModules,jsModuleWords,jsComment,jsTemplateString,jsStringD,jsStringS,jsRegexpString,jsNumber,jsFloat,jsThis,jsOperator,jsBooleanTrue,jsBooleanFalse,jsNull,jsFunction,jsArrowFunction,jsGlobalObjects,jsExceptions,jsDomErrNo,jsDomNodeConsts,jsHtmlEvents,jsDotNotation,jsBracket,jsParen,jsFuncCall,jsUndefined,jsNan,jsKeyword,jsStorageClass,jsPrototype,jsBuiltins,jsNoise,jsAssignmentExpr,jsArgsObj,jsBlock,jsClassDefinition +syntax region jsExportContainer start="^\s\?export \?" end="$" contains=jsModules,jsModuleWords,jsComment,jsTemplateString,jsStringD,jsStringS,jsRegexpString,jsNumber,jsFloat,jsThis,jsOperator,jsBooleanTrue,jsBooleanFalse,jsNull,jsFunction,jsArrowFunction,jsGlobalObjects,jsExceptions,jsDomErrNo,jsDomNodeConsts,jsHtmlEvents,jsDotNotation,jsBracket,jsParen,jsFuncCall,jsUndefined,jsNan,jsKeyword,jsStorageClass,jsPrototype,jsBuiltins,jsNoise,jsArgsObj,jsBlock,jsClassDefinition "" JavaScript comments syntax keyword jsCommentTodo TODO FIXME XXX TBD contained @@ -106,12 +106,6 @@ syntax match jsFunctionKey /\<[a-zA-Z_$][0-9a-zA-Z_$]*\>\(\s*:\s*function syntax match jsDecorator "@" display contains=jsDecoratorFunction nextgroup=jsDecoratorFunction skipwhite syntax match jsDecoratorFunction "[a-zA-Z_][a-zA-Z0-9_.]*" display contained nextgroup=jsFunc skipwhite -syntax match jsAssignmentExpr /\v%([a-zA-Z_$]\k*\.)*[a-zA-Z_$]\k*\s*\=\>@!/ contains=jsFuncAssignExpr,jsAssignExpIdent,jsPrototype,jsOperator,jsThis,jsNoise,jsArgsObj -syntax match jsAssignExpIdent /\v[a-zA-Z_$]\k*\ze%(\s*\=)/ contained -syntax match jsFuncAssignExpr /\v%(%([a-zA-Z_$]\k*\.)*[a-zA-Z_$]\k*\s*\=\s*){-1,}\ze%(function\s*\*?\s*\()/ contains=jsFuncAssignObjChain,jsFuncAssignIdent,jsFunction,jsPrototype,jsOperator,jsThis,jsArgsObj contained -syntax match jsFuncAssignObjChain /\v%([a-zA-Z_$]\k*\.)+/ contains=jsPrototype,jsNoise contained -syntax match jsFuncAssignIdent /\v[a-zA-Z_$]\k*\ze%(\s*\=)/ contained - exe 'syntax keyword jsNull null '.(exists('g:javascript_conceal_null') ? 'conceal cchar='.g:javascript_conceal_null : '') exe 'syntax keyword jsReturn return '.(exists('g:javascript_conceal_return') ? 'conceal cchar='.g:javascript_conceal_return : '') exe 'syntax keyword jsUndefined undefined '.(exists('g:javascript_conceal_undefined') ? 'conceal cchar='.g:javascript_conceal_undefined : '') @@ -188,7 +182,7 @@ endif "DOM/HTML/CSS "" end DOM/HTML/CSS specified things "" Code blocks -syntax cluster jsExpression contains=jsComment,jsLineComment,jsBlockComment,jsTaggedTemplate,jsTemplateString,jsStringD,jsStringS,jsRegexpString,jsNumber,jsFloat,jsThis,jsStatic,jsSuper,jsOperator,jsBooleanTrue,jsBooleanFalse,jsNull,jsFunction,jsArrowFunction,jsGlobalObjects,jsExceptions,jsFutureKeys,jsDomErrNo,jsDomNodeConsts,jsHtmlEvents,jsDotNotation,jsBracket,jsParen,jsBlock,jsFuncCall,jsUndefined,jsNan,jsKeyword,jsStorageClass,jsPrototype,jsBuiltins,jsNoise,jsCommonJS,jsAssignmentExpr,jsImportContainer,jsExportContainer,jsArgsObj,jsDecorator,jsAsyncKeyword,jsClassDefinition,jsArrowFunction,jsArrowFuncArgs +syntax cluster jsExpression contains=jsComment,jsLineComment,jsBlockComment,jsTaggedTemplate,jsTemplateString,jsStringD,jsStringS,jsRegexpString,jsNumber,jsFloat,jsThis,jsStatic,jsSuper,jsOperator,jsBooleanTrue,jsBooleanFalse,jsNull,jsFunction,jsArrowFunction,jsGlobalObjects,jsExceptions,jsFutureKeys,jsDomErrNo,jsDomNodeConsts,jsHtmlEvents,jsDotNotation,jsBracket,jsParen,jsBlock,jsFuncCall,jsUndefined,jsNan,jsKeyword,jsStorageClass,jsPrototype,jsBuiltins,jsNoise,jsCommonJS,jsImportContainer,jsExportContainer,jsArgsObj,jsDecorator,jsAsyncKeyword,jsClassDefinition,jsArrowFunction,jsArrowFuncArgs syntax cluster jsAll contains=@jsExpression,jsLabel,jsConditional,jsRepeat,jsReturn,jsStatement,jsTernaryIf,jsException syntax region jsBracket matchgroup=jsBrackets start="\[" end="\]" contains=@jsAll,jsParensErrB,jsParensErrC,jsBracket,jsParen,jsBlock,@htmlPreproc fold syntax region jsParen matchgroup=jsParens start="(" end=")" contains=@jsAll,jsOf,jsParensErrA,jsParensErrC,jsParen,jsBracket,jsBlock,@htmlPreproc fold extend From f7d220719168fe0ca84eb9c9a3d77bdc50388584 Mon Sep 17 00:00:00 2001 From: Amadeus Demarzi Date: Thu, 21 Apr 2016 18:16:50 -0700 Subject: [PATCH 25/31] Optimized jsGlobalObjects We had some special matching for Intl and certain submethods. It seems needless to do this for the following reasons: * The look behind added massive overhead (especially since the rule was not contained) * We never do any special matching for any other global objects, so why these? --- syntax/javascript.vim | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/syntax/javascript.vim b/syntax/javascript.vim index 1ff8bda9..e9d4b986 100644 --- a/syntax/javascript.vim +++ b/syntax/javascript.vim @@ -124,8 +124,7 @@ syntax keyword jsKeyword yield syntax keyword jsException try catch throw finally syntax keyword jsAsyncKeyword async await -syntax keyword jsGlobalObjects Array Boolean Date Function Iterator Number Object Symbol Map WeakMap Set RegExp String Proxy Promise Buffer ParallelArray ArrayBuffer DataView Float32Array Float64Array Int16Array Int32Array Int8Array Uint16Array Uint32Array Uint8Array Uint8ClampedArray Intl JSON Math console document window -syntax match jsGlobalObjects /\%(Intl\.\)\@<=\(Collator\|DateTimeFormat\|NumberFormat\)/ +syntax keyword jsGlobalObjects Array Boolean Date Function Iterator Number Object Symbol Map WeakMap Set RegExp String Proxy Promise Buffer ParallelArray ArrayBuffer DataView Float32Array Float64Array Int16Array Int32Array Int8Array Uint16Array Uint32Array Uint8Array Uint8ClampedArray JSON Math console document window Intl Collator DateTimeFormat NumberFormat syntax keyword jsExceptions Error EvalError InternalError RangeError ReferenceError StopIteration SyntaxError TypeError URIError From 33eb9fe82ac16f8e9fe994224aeffc502e0cef41 Mon Sep 17 00:00:00 2001 From: Amadeus Demarzi Date: Thu, 21 Apr 2016 18:18:14 -0700 Subject: [PATCH 26/31] Optimized jsArrowFuncArgs selector Shaved off some average time by removing the groups, which weren't really needed to begin with --- syntax/javascript.vim | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/syntax/javascript.vim b/syntax/javascript.vim index e9d4b986..47f9483f 100644 --- a/syntax/javascript.vim +++ b/syntax/javascript.vim @@ -214,7 +214,7 @@ syntax match jsFuncArgRest contained /\%(\.\.\.[a-zA-Z_$][0-9a-zA-Z_$]*\)) syntax match jsFuncArgRestDots contained /\.\.\./ " Matches a single keyword argument with no parens -syntax match jsArrowFuncArgs /\(\k\)\+\s*\(=>\)\@=/ skipwhite contains=jsFuncArgs nextgroup=jsArrowFunction extend +syntax match jsArrowFuncArgs /\k\+\s*\%(=>\)\@=/ skipwhite contains=jsFuncArgs nextgroup=jsArrowFunction extend " Matches a series of arguments surrounded in parens syntax match jsArrowFuncArgs /([^()]*)\s*\(=>\)\@=/ skipempty skipwhite contains=jsFuncArgs nextgroup=jsArrowFunction extend From 508c1a337bc06556a9d425f77f86788f303195d3 Mon Sep 17 00:00:00 2001 From: Amadeus Demarzi Date: Thu, 21 Apr 2016 18:20:01 -0700 Subject: [PATCH 27/31] Remove syntax sync clear The optimizations it provides really doesn't seem to help much and usually just results in weird syntax matching errors unless you run `syntax sync fromstart` --- syntax/javascript.vim | 6 ------ 1 file changed, 6 deletions(-) diff --git a/syntax/javascript.vim b/syntax/javascript.vim index 47f9483f..504c5594 100644 --- a/syntax/javascript.vim +++ b/syntax/javascript.vim @@ -196,12 +196,6 @@ syntax match jsParensErrA contained "\]" syntax match jsParensErrB contained ")" syntax match jsParensErrC contained "}" -if main_syntax == "javascript" - syntax sync clear - syntax sync ccomment jsComment minlines=200 - syntax sync match jsHighlight grouphere jsBlock /{/ -endif - syntax match jsFuncArgDestructuring contained /\({\|}\|=\|:\|\[\|\]\)/ extend exe 'syntax match jsFunction /\/ nextgroup=jsGenerator,jsFuncName,jsFuncArgs skipwhite '.(exists('g:javascript_conceal_function') ? 'conceal cchar='.g:javascript_conceal_function : '') exe 'syntax match jsArrowFunction /=>/ skipwhite nextgroup=jsFuncBlock contains=jsFuncBraces '.(exists('g:javascript_conceal_arrow_function') ? 'conceal cchar='.g:javascript_conceal_arrow_function : '') From 3a4991eaf5c52ea4d546402418a02a22ae60a0df Mon Sep 17 00:00:00 2001 From: Amadeus Demarzi Date: Thu, 21 Apr 2016 21:28:52 -0700 Subject: [PATCH 28/31] Improved jsTaggedTemplate performance Another match that turns up pretty high in the list of total time spent under `syntime` --- syntax/javascript.vim | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/syntax/javascript.vim b/syntax/javascript.vim index 504c5594..ea934452 100644 --- a/syntax/javascript.vim +++ b/syntax/javascript.vim @@ -88,7 +88,7 @@ syntax region jsTemplateVar matchgroup=jsTemplateBraces start=+${+ end=+}+ syntax region jsStringD start=+"+ skip=+\\\("\|$\)+ end=+"\|$+ contains=jsSpecial,@htmlPreproc,@Spell syntax region jsStringS start=+'+ skip=+\\\('\|$\)+ end=+'\|$+ contains=jsSpecial,@htmlPreproc,@Spell syntax region jsTemplateString start=+`+ skip=+\\\(`\|$\)+ end=+`+ contains=jsTemplateVar,jsSpecial,@htmlPreproc -syntax region jsTaggedTemplate start=/\k\+\(\(\n\|\s\)\+\)\?`/ end=+`+ contains=jsTemplateString keepend +syntax region jsTaggedTemplate start=/\k\+\%([\n\s]\+\)\?`/ end=+`+ contains=jsTemplateString keepend syntax region jsRegexpCharClass start=+\[+ skip=+\\.+ end=+\]+ contained syntax match jsRegexpBoundary "\v%(\<@![\^$]|\\[bB])" contained syntax match jsRegexpBackRef "\v\\[1-9][0-9]*" contained From 842b0ceaa87936c1eb449617e7045ad33b81854e Mon Sep 17 00:00:00 2001 From: Amadeus Demarzi Date: Thu, 21 Apr 2016 21:37:03 -0700 Subject: [PATCH 29/31] Improved performance of jsRegexpString --- syntax/javascript.vim | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/syntax/javascript.vim b/syntax/javascript.vim index ea934452..3d9ab190 100644 --- a/syntax/javascript.vim +++ b/syntax/javascript.vim @@ -97,7 +97,7 @@ syntax match jsRegexpOr "\v\<@!\|" contained syntax match jsRegexpMod "\v\(@<=\?[:=!>]" contained syntax cluster jsRegexpSpecial contains=jsSpecial,jsRegexpBoundary,jsRegexpBackRef,jsRegexpQuantifier,jsRegexpOr,jsRegexpMod syntax region jsRegexpGroup start="\\\@\|\<0[xX]\x\+\>/ syntax keyword jsNumber Infinity syntax match jsFloat /\<-\=\%(\d\+\.\d\+\|\d\+\.\|\.\d\+\)\%([eE][+-]\=\d\+\)\=\>/ From c2bc4c70140ec761fe02c6b3a9a8370a182e931f Mon Sep 17 00:00:00 2001 From: Amadeus Demarzi Date: Sun, 24 Apr 2016 14:18:56 -0700 Subject: [PATCH 30/31] Limiting jsRegexpString look behinds --- syntax/javascript.vim | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/syntax/javascript.vim b/syntax/javascript.vim index 3d9ab190..3bdb39a6 100644 --- a/syntax/javascript.vim +++ b/syntax/javascript.vim @@ -97,7 +97,7 @@ syntax match jsRegexpOr "\v\<@!\|" contained syntax match jsRegexpMod "\v\(@<=\?[:=!>]" contained syntax cluster jsRegexpSpecial contains=jsSpecial,jsRegexpBoundary,jsRegexpBackRef,jsRegexpQuantifier,jsRegexpOr,jsRegexpMod syntax region jsRegexpGroup start="\\\@\|\<0[xX]\x\+\>/ syntax keyword jsNumber Infinity syntax match jsFloat /\<-\=\%(\d\+\.\d\+\|\d\+\.\|\.\d\+\)\%([eE][+-]\=\d\+\)\=\>/ From 4b6f9c5d9d15deb12d14d85a155d73c9b7da6019 Mon Sep 17 00:00:00 2001 From: Amadeus Demarzi Date: Mon, 25 Apr 2016 11:48:35 -0700 Subject: [PATCH 31/31] Bumping version number to v1.0.0 --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 617df9f1..fb5139c9 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# vim-javascript v0.10.0 +# vim-javascript v1.0.0 JavaScript bundle for vim, this bundle provides syntax highlighting and improved indentation.