diff --git a/README.md b/README.md index 797c89e4..fb5139c9 100644 --- a/README.md +++ b/README.md @@ -1,68 +1,75 @@ -# vim-javascript v0.10.0 +# vim-javascript v1.0.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. +``` +let g:javascript_ignore_javaScriptdoc = 1 +``` -Default Value: 1 +Disables JSDoc syntax highlighting +Default Value: 0 -#### javascript_ignore_javaScriptdoc +----------------- -Disables JSDoc syntax highlighting +``` +set foldmethod=syntax +``` -Default Value: 0 +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 + +## Concealing Characters You can customize concealing characters by defining one or more of the following variables: @@ -78,6 +85,7 @@ variables: let g:javascript_conceal_super = "Ω" let g:javascript_conceal_arrow_function = "⇒" + ## Contributing This project uses the [git @@ -88,6 +96,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`. diff --git a/indent/javascript.vim b/indent/javascript.vim index a39e1335..80778907 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\)\@].*,\)' . 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: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 +let s:block_regex = '\%([{([]\)\s*\%(|\%([*@]\=\h\w*,\=\s*\)\%(,\s*[*@]\=\h\w*\)*|\)\=' . s:line_term + +let s:operator_first = '^\s*\%([*/.:?]\|\([-+]\)\1\@!\|||\|&&\)' -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*$' -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, ':\(.\)') @@ -102,6 +104,11 @@ function s:IsInString(lnum, col) return synIDattr(synID(a:lnum, a:col, 1), 'name') =~ s:syng_string endfunction +" Check if the character at lnum:col is inside a template string. +function s:IsInTempl(lnum, col) + return synIDattr(synID(a:lnum, a:col, 1), 'name') =~ s:syng_template +endfunction + " Check if the character at lnum:col is inside a multi-line comment. function s:IsInMultilineComment(lnum, col) return !s:IsLineComment(a:lnum, a:col) && synIDattr(synID(a:lnum, a:col, 1), 'name') =~ s:syng_multiline @@ -120,13 +127,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 @@ -146,9 +153,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' && !a:in_one_line_scope + 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 " @@ -159,7 +178,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 @@ -240,7 +259,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) @@ -378,12 +397,45 @@ 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() + end + " If previous line starts with an operator... + 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) + " 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 getline(prevline) =~ '^\s*`$' && s:IsInTempl(v:lnum, 1) + if line !~ '^\s*`$' return indent(prevline) + s:sw() endif + elseif line =~ '^\s*`$' && s:IsInTempl(prevline, 1) + return indent(prevline) - s:sw() endif " If we are in a multi-line comment, cindent does the right thing. @@ -438,17 +490,36 @@ 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) end - endif + 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) + " 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 " -------------------------- diff --git a/syntax/javascript.vim b/syntax/javascript.vim index 0fa7130d..3bdb39a6 100644 --- a/syntax/javascript.vim +++ b/syntax/javascript.vim @@ -16,23 +16,17 @@ 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+=$ 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 @@ -42,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 @@ -63,7 +57,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,13 +65,15 @@ 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 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\|\.\|:\|\/\|\[\|]\|=\)\+" + syntax match jsDocParam contained "\%(#\|\$\|-\|'\|\"\|{.\{-}}\|\w\|\.\|:\|\/\|\[.{-}]\|=\)\+" syntax region jsDocSeeTag contained matchgroup=jsDocSeeTag start="{" end="}" contains=jsDocTags syntax case match @@ -92,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 @@ -101,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\+\)\=\>/ @@ -110,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 : '') @@ -134,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 @@ -192,13 +181,13 @@ 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 -syntax region jsClassBlock matchgroup=jsClassBraces start="{" end="}" contains=jsFuncName,jsClassMethodDefinitions 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 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 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 @@ -207,27 +196,21 @@ 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 : '') 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 @@ -254,6 +237,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