diff --git a/indent/javascript.vim b/indent/javascript.vim index 8bd4bcf5..78d5d4e5 100644 --- a/indent/javascript.vim +++ b/indent/javascript.vim @@ -117,21 +117,17 @@ 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) @@ -148,11 +144,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 +195,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 +220,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 @@ -345,15 +319,14 @@ function GetJavascriptIndent() let line = getline(v:lnum) " previous nonblank line number 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 . '[''"`]' - return indent(v:lnum) + if line !~ '^[''"`]' && synIDattr(synID(v:lnum, 1, 1), 'name') =~? 'string\|template' + return -1 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,45 +348,47 @@ 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 + 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 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 - 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('(', '', ')', '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 - 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 @@ -429,7 +404,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 @@ -454,23 +428,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()