From 47b5324c3c69952c5e9bfc2acb0b2275cfc50a12 Mon Sep 17 00:00:00 2001 From: bounceme Date: Sun, 29 May 2016 13:33:47 -0700 Subject: [PATCH 1/5] readability changes in the indent script this makes almost no difference to the indenter's effects. I found that our most time consuming indent operation is from the 'skip_expr' which looks at syntax items, removing 'regex' from it seems to help a bit --- indent/javascript.vim | 71 ++++++++++++------------------------------- 1 file changed, 19 insertions(+), 52 deletions(-) diff --git a/indent/javascript.vim b/indent/javascript.vim index 8bd4bcf5..11efc6d9 100644 --- a/indent/javascript.vim +++ b/indent/javascript.vim @@ -45,7 +45,7 @@ let s:line_pre = '^\s*\%(\/\*.*\*\/\s*\)*' let s:js_keywords = s:line_pre . '\%(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\)\>\C' let s:expr_case = s:line_pre . '\%(case\s\+[^\:]*\|default\)\s*:\s*\C' " Regex of syntax group names that are or delimit string or are comments. -let s:syng_strcom = '\%(string\|regex\|comment\|template\)\c' +let s:syng_strcom = '\%(string\|comment\|template\)\c' " Regex of syntax group names that are strings. let s:syng_string = 'regex\c' @@ -148,11 +148,9 @@ function s:GetMSL(lnum, in_one_line_scope) " If we have a continuation line, or we're in a string, use line as MSL. " Otherwise, terminate search as we have found our MSL already. let line = getline(lnum) - let col = match(line, s:continuation_regex) + 1 - let coal = match(line, s:comma_last) + 1 let line2 = getline(msl) let col2 = matchend(line2, ')') - if ((col > 0 && !s:IsInStringOrComment(lnum, col) || coal > 0 && !s:IsInStringOrComment(lnum,coal)) && + if ((s:Match(lnum,s:continuation_regex) || s:Match(lnum, s:comma_last)) && \ !s:Match(lnum, s:expr_case)) || s:IsInString(lnum, strlen(line)) let msl = lnum @@ -201,8 +199,9 @@ function s:InMultiVarStatement(lnum, cont, prev) " if the line is a js keyword if a:cont call cursor(lnum,1) - if searchpair('{', '', '}', 'bW', s:skip_expr) > 0 - let lnum = line('.') + let parlnum = searchpair('(\|{\|\[', '', ')\|}\|\]', 'nbW', s:skip_expr) + if parlnum > 0 + let lnum = parlnum end end if s:Match(lnum, s:js_keywords) @@ -225,27 +224,6 @@ function s:InMultiVarStatement(lnum, cont, prev) return 0 endfunction -" Find line above with beginning of the var statement or returns 0 if it's not"{{{2 -" this statement -" function s:GetVarIndent(lnum) -" let lvar = s:InMultiVarStatement(a:lnum, 0,0) -" let prev_lnum = s:PrevNonBlankNonString(a:lnum - 1) - -" if lvar -" let line = s:RemoveTrailingComments(getline(prev_lnum)) - -" " if the previous line doesn't end in a comma, return to regular indent -" if (line !~ s:comma_last) -" return indent(prev_lnum) - s:sw() -" else -" return indent(lvar) + s:sw() -" endif -" endif - -" return -1 -" endfunction"}}} - - " Check if line 'lnum' has more opening brackets than closing ones. function s:LineHasOpeningBrackets(lnum) let open_0 = 0 @@ -347,13 +325,12 @@ function GetJavascriptIndent() let prevline = prevnonblank(v:lnum - 1) " to not change multiline string values - if synIDattr(synID(v:lnum, 1, 1), 'name') =~? 'string\|template' && line !~ s:line_pre . '[''"`]' + if line !~ '^[''"`]' && synIDattr(synID(v:lnum, 1, 1), 'name') =~? 'string\|template' return indent(v:lnum) endif " If we are in a multi-line comment, cindent does the right thing. - if s:IsInMultilineComment(v:lnum, 1) && !s:IsLineComment(v:lnum, 1) && - \ s:IsInMultilineComment(v:lnum, match(line, '\s*$')) && line !~ '^\/\*' + if s:IsInMultilineComment(v:lnum, 1) && line !~ '^\/\*' return cindent(v:lnum) endif @@ -375,9 +352,9 @@ function GetJavascriptIndent() call cursor(v:lnum, col) - let bs = strpart('(){}[]', stridx(')}]', line[col - 1]) * 2, 2) - if searchpair(escape(bs[0], '\['), '', bs[1], 'bW', s:skip_expr) > 0 - let ind = s:InMultiVarStatement(line('.'), 0, 0) ? indent(line('.')) : indent(s:GetMSL(line('.'), 0)) + let parlnum = searchpair('(\|{\|\[', '', ')\|}\|\]', 'nbW', s:skip_expr) + if parlnum > 0 + let ind = s:InMultiVarStatement(parlnum, 0, 0) ? indent(parlnum) : indent(s:GetMSL(parlnum, 0)) endif return ind endif @@ -392,9 +369,9 @@ function GetJavascriptIndent() if counts[0] == '2' || counts[1] == '2' || counts[2] == '2' call cursor(prevline, 1) " Search for the opening tag - let bs = strpart('(){}[]', stridx(')}]', line[col - 1]) * 2, 2) - if searchpair(escape(bs[0], '\['), '', bs[1], 'bW', s:skip_expr) > 0 && s:Match(line('.'), s:operator_first) - return indent(line('.')) + let parlnum = searchpair('(\|{\|\[', '', ')\|}\|\]', 'nbW', s:skip_expr) + if parlnum > 0 && s:Match(parlnum, s:operator_first) + return indent(parlnum) end elseif counts[0] != '1' && counts[1] != '1' && counts[2] != '1' " otherwise, indent 1 level @@ -407,7 +384,7 @@ function GetJavascriptIndent() if counts[0] == '2' && !s:Match(prevline, s:operator_first) call cursor(prevline, 1) " Search for the opening tag - let mnum = searchpair('(', '', ')', 'bW', s:skip_expr) + let mnum = searchpair('(', '', ')', 'nbW', s:skip_expr) if mnum > 0 && s:Match(mnum, s:operator_first) return indent(mnum) - s:sw() end @@ -454,23 +431,13 @@ function GetJavascriptIndent() " add indent depending on the bracket type. if s:Match(lnum, '[[({})\]]') let counts = s:LineHasOpeningBrackets(lnum) - if counts[0] == '2' - call cursor(lnum, 1) - " Search for the opening tag - if searchpair('(', '', ')', 'bW', s:skip_expr) > 0 - return indent(s:GetMSL(line('.'), 0)) - end - elseif counts[1] == '2' && !s:Match(lnum, s:line_pre . '}') - call cursor(lnum, 1) - " Search for the opening tag - if searchpair('{', '', '}', 'bW', s:skip_expr) > 0 - return indent(s:GetMSL(line('.'), 0)) - end - elseif counts[2] == '2' && !s:Match(lnum, s:line_pre . ']') + if counts[0] == '2' || (counts[1] == '2' && !s:Match(lnum, s:line_pre . '}')) + \ || (counts[2] == '2' && !s:Match(lnum, s:line_pre . ']')) call cursor(lnum, 1) " Search for the opening tag - if searchpair('\[', '', '\]', 'bW', s:skip_expr) > 0 - return indent(s:GetMSL(line('.'), 0)) + let parlnum = searchpair('(\|{\|\[', '', ')\|}\|\]', 'nbW', s:skip_expr) + if parlnum > 0 + return indent(s:GetMSL(parlnum, 0)) end elseif counts[1] == '1' || counts[2] == '1' || counts[0] == '1' || s:Onescope(lnum) return ind + s:sw() From d70fd36c7a90d8da0203b2616ea1f09eab859114 Mon Sep 17 00:00:00 2001 From: bounceme Date: Sun, 29 May 2016 22:23:51 -0700 Subject: [PATCH 2/5] Update javascript.vim --- indent/javascript.vim | 63 ++++++++++++++++++++++++++++--------------- 1 file changed, 41 insertions(+), 22 deletions(-) diff --git a/indent/javascript.vim b/indent/javascript.vim index 11efc6d9..e7d3ac70 100644 --- a/indent/javascript.vim +++ b/indent/javascript.vim @@ -117,21 +117,19 @@ endfunction " Find line above 'lnum' that isn't empty, in a comment, or in a string. function s:PrevNonBlankNonString(lnum) - let in_block = 0 let lnum = prevnonblank(a:lnum) while lnum > 0 " 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 s:IsInMultilineComment(lnum, matchend(line, '^\s*/\*') - 1) && line !~ s:line_pre . '$' - if in_block - let in_block = 0 - else - break - endif - elseif !in_block && s:IsInMultilineComment(lnum, match(line, '\*/\s*$') + 1) && line !~ s:line_pre . '$' - let in_block = 1 - elseif !in_block && line !~ s:line_pre . '\%(//\).*$' && !(s:IsInStringOrComment(lnum, 1) && s:IsInStringOrComment(lnum, strlen(line))) + let com = match(line, '\*\/') + 1 + if s:IsInMultilineComment(lnum, com) + call cursor(lnum, com) + let parlnum = search('/\*', 'nbW') + if parlnum > 0 + let lnum = parlnum + end + elseif line !~ '^' . s:line_term break endif let lnum = prevnonblank(lnum - 1) @@ -224,6 +222,27 @@ function s:InMultiVarStatement(lnum, cont, prev) return 0 endfunction +" Find line above with beginning of the var statement or returns 0 if it's not"{{{2 +" this statement +" function s:GetVarIndent(lnum) +" let lvar = s:InMultiVarStatement(a:lnum, 0,0) +" let prev_lnum = s:PrevNonBlankNonString(a:lnum - 1) + +" if lvar +" let line = s:RemoveTrailingComments(getline(prev_lnum)) + +" " if the previous line doesn't end in a comma, return to regular indent +" if (line !~ s:comma_last) +" return indent(prev_lnum) - s:sw() +" else +" return indent(lvar) + s:sw() +" endif +" endif + +" return -1 +" endfunction"}}} + + " Check if line 'lnum' has more opening brackets than closing ones. function s:LineHasOpeningBrackets(lnum) let open_0 = 0 @@ -359,15 +378,16 @@ function GetJavascriptIndent() return ind endif + let lnum = s:PrevNonBlankNonString(v:lnum - 1) " If line starts with an operator... if (line =~ s:operator_first) - if (s:Match(prevline, s:operator_first)) + if (s:Match(lnum, s:operator_first)) " and so does previous line, don't indent - return indent(prevline) + return indent(lnum) end - let counts = s:LineHasOpeningBrackets(prevline) + let counts = s:LineHasOpeningBrackets(lnum) if counts[0] == '2' || counts[1] == '2' || counts[2] == '2' - call cursor(prevline, 1) + call cursor(lnum, 1) " Search for the opening tag let parlnum = searchpair('(\|{\|\[', '', ')\|}\|\]', 'nbW', s:skip_expr) if parlnum > 0 && s:Match(parlnum, s:operator_first) @@ -375,22 +395,22 @@ function GetJavascriptIndent() end elseif counts[0] != '1' && counts[1] != '1' && counts[2] != '1' " otherwise, indent 1 level - return indent(prevline) + s:sw() + return indent(lnum) + s:sw() end " If previous line starts with an operator... - elseif (s:Match(prevline, s:operator_first) && !s:Match(prevline,s:continuation_regex))||getline(prevline) =~ ');\=' . s:line_term - let counts = s:LineHasOpeningBrackets(prevline) - if counts[0] == '2' && !s:Match(prevline, s:operator_first) - call cursor(prevline, 1) + elseif (s:Match(lnum, s:operator_first) && !s:Match(lnum,s:continuation_regex))||getline(lnum) =~ ');\=' . s:line_term + let counts = s:LineHasOpeningBrackets(lnum) + if counts[0] == '2' && !s:Match(lnum, s:operator_first) + call cursor(lnum, 1) " Search for the opening tag let mnum = searchpair('(', '', ')', 'nbW', s:skip_expr) if mnum > 0 && s:Match(mnum, s:operator_first) return indent(mnum) - s:sw() end - elseif s:Match(prevline, s:operator_first) + elseif s:Match(lnum, s:operator_first) if counts[0] != '1' && counts[1] != '1' && counts[2] != '1' - return indent(prevline) - s:sw() + return indent(lnum) - s:sw() end end end @@ -406,7 +426,6 @@ function GetJavascriptIndent() endif " Find a non-blank, non-multi-line string line above the current line. - let lnum = s:PrevNonBlankNonString(v:lnum - 1) " If the line is empty and inside a string, use the previous line. if line =~ '^\s*$' && lnum != prevline From 4028adfdcc410bd310921acce4bd13c85721bbd4 Mon Sep 17 00:00:00 2001 From: bounceme Date: Sun, 29 May 2016 22:25:00 -0700 Subject: [PATCH 3/5] Update javascript.vim --- indent/javascript.vim | 21 --------------------- 1 file changed, 21 deletions(-) diff --git a/indent/javascript.vim b/indent/javascript.vim index e7d3ac70..f2528e3f 100644 --- a/indent/javascript.vim +++ b/indent/javascript.vim @@ -222,27 +222,6 @@ function s:InMultiVarStatement(lnum, cont, prev) return 0 endfunction -" Find line above with beginning of the var statement or returns 0 if it's not"{{{2 -" this statement -" function s:GetVarIndent(lnum) -" let lvar = s:InMultiVarStatement(a:lnum, 0,0) -" let prev_lnum = s:PrevNonBlankNonString(a:lnum - 1) - -" if lvar -" let line = s:RemoveTrailingComments(getline(prev_lnum)) - -" " if the previous line doesn't end in a comma, return to regular indent -" if (line !~ s:comma_last) -" return indent(prev_lnum) - s:sw() -" else -" return indent(lvar) + s:sw() -" endif -" endif - -" return -1 -" endfunction"}}} - - " Check if line 'lnum' has more opening brackets than closing ones. function s:LineHasOpeningBrackets(lnum) let open_0 = 0 From 170be156ef857d243117a5a88f48343dd1a143db Mon Sep 17 00:00:00 2001 From: bounceme Date: Sun, 29 May 2016 23:48:27 -0700 Subject: [PATCH 4/5] Update javascript.vim --- indent/javascript.vim | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/indent/javascript.vim b/indent/javascript.vim index f2528e3f..2476d977 100644 --- a/indent/javascript.vim +++ b/indent/javascript.vim @@ -119,10 +119,8 @@ endfunction function s:PrevNonBlankNonString(lnum) let lnum = prevnonblank(a:lnum) while lnum > 0 - " 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) - let com = match(line, '\*\/') + 1 + let com = match(line, '\*/') + 1 if s:IsInMultilineComment(lnum, com) call cursor(lnum, com) let parlnum = search('/\*', 'nbW') @@ -358,6 +356,7 @@ function GetJavascriptIndent() endif let lnum = s:PrevNonBlankNonString(v:lnum - 1) + " If line starts with an operator... if (line =~ s:operator_first) if (s:Match(lnum, s:operator_first)) @@ -429,8 +428,8 @@ function GetJavascriptIndent() " add indent depending on the bracket type. if s:Match(lnum, '[[({})\]]') let counts = s:LineHasOpeningBrackets(lnum) - if counts[0] == '2' || (counts[1] == '2' && !s:Match(lnum, s:line_pre . '}')) - \ || (counts[2] == '2' && !s:Match(lnum, s:line_pre . ']')) + if counts[0] == '2' || (counts[1] == '2' && !s:Match(lnum, s:line_pre . '}')) || + \ (counts[2] == '2' && !s:Match(lnum, s:line_pre . ']')) call cursor(lnum, 1) " Search for the opening tag let parlnum = searchpair('(\|{\|\[', '', ')\|}\|\]', 'nbW', s:skip_expr) From ce053fbc7d0cc9035129b6cead059be1ce5369e8 Mon Sep 17 00:00:00 2001 From: bounceme Date: Mon, 30 May 2016 11:11:21 -0700 Subject: [PATCH 5/5] Update javascript.vim --- indent/javascript.vim | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/indent/javascript.vim b/indent/javascript.vim index 2476d977..78d5d4e5 100644 --- a/indent/javascript.vim +++ b/indent/javascript.vim @@ -45,7 +45,7 @@ let s:line_pre = '^\s*\%(\/\*.*\*\/\s*\)*' let s:js_keywords = s:line_pre . '\%(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\)\>\C' let s:expr_case = s:line_pre . '\%(case\s\+[^\:]*\|default\)\s*:\s*\C' " Regex of syntax group names that are or delimit string or are comments. -let s:syng_strcom = '\%(string\|comment\|template\)\c' +let s:syng_strcom = '\%(string\|regex\|comment\|template\)\c' " Regex of syntax group names that are strings. let s:syng_string = 'regex\c' @@ -120,10 +120,10 @@ function s:PrevNonBlankNonString(lnum) let lnum = prevnonblank(a:lnum) while lnum > 0 let line = getline(lnum) - let com = match(line, '\*/') + 1 + let com = match(line, '\*\/') + 1 if s:IsInMultilineComment(lnum, com) call cursor(lnum, com) - let parlnum = search('/\*', 'nbW') + let parlnum = search('\/\*', 'nbW') if parlnum > 0 let lnum = parlnum end @@ -319,10 +319,10 @@ function GetJavascriptIndent() let line = getline(v:lnum) " previous nonblank line number let prevline = prevnonblank(v:lnum - 1) - + " to not change multiline string values if line !~ '^[''"`]' && synIDattr(synID(v:lnum, 1, 1), 'name') =~? 'string\|template' - return indent(v:lnum) + return -1 endif " If we are in a multi-line comment, cindent does the right thing.