diff options
Diffstat (limited to '')
| -rw-r--r-- | autoload/go/config.vim | 5 | ||||
| -rw-r--r-- | autoload/jsx_pretty/indent.vim | 623 | 
2 files changed, 163 insertions, 465 deletions
| diff --git a/autoload/go/config.vim b/autoload/go/config.vim index f4ec3ccf..b70f7b75 100644 --- a/autoload/go/config.vim +++ b/autoload/go/config.vim @@ -368,6 +368,11 @@ function! go#config#PlayOpenBrowser() abort    return get(g:, "go_play_open_browser", 1)  endfunction +function! go#config#GorenameCommand() abort +  " delegate to go#config#GorenameBin for backwards compatability. +  return get(g:, "go_gorename_command", go#config#GorenameBin()) +endfunction +  function! go#config#GorenameBin() abort    return get(g:, "go_gorename_bin", "gorename")  endfunction diff --git a/autoload/jsx_pretty/indent.vim b/autoload/jsx_pretty/indent.vim index 03bdf29b..b3b1e5c1 100644 --- a/autoload/jsx_pretty/indent.vim +++ b/autoload/jsx_pretty/indent.vim @@ -15,6 +15,10 @@ let s:start_tag = '<\_s*\%(>\|\${\|\%(\<[-:._$A-Za-z0-9]\+\>\)\)'  " Regexp for the end tag  let s:end_tag = '\%(<\_s*/\_s*\%(\<[-:._$A-Za-z0-9]\+\>\)\_s*>\|/\_s*>\)' +function s:trim(line) +  return substitute(a:line, '^\s*\|\s*$', '', 'g') +endfunction +  " Get the syntax stack at the given position  function s:syntax_stack_at(lnum, col)    return map(synstack(a:lnum, a:col), 'synIDattr(v:val, "name")') @@ -30,22 +34,11 @@ function s:start_col(lnum)    return len(matchstr(getline(a:lnum), '^\s*')) + 1  endfunction -" Get the end col of the non-space charactor -function s:end_col(lnum) -  return len(substitute(getline(a:lnum), '\s*$', '', 'g')) -endfunction -  " Get the start syntax of a given line number  function s:start_syntax(lnum)    return s:syntax_at(a:lnum, s:start_col(a:lnum))  endfunction -" Get the end syntax of a given line number -function s:end_syntax(lnum) -  let end_col = len(substitute(getline(a:lnum), '\s*$', '', 'g')) -  return s:syntax_at(a:lnum, end_col) -endfunction -  " The skip function for searchpair  function s:skip_if_not(current_lnum, ...)    " Skip the match in current line @@ -57,47 +50,6 @@ function s:skip_if_not(current_lnum, ...)    return syntax !~? join(a:000, '\|')  endfunction -" Whether the specified stytax group is an jsx-related syntax -function s:is_jsx(syntax_name) -  return a:syntax_name =~ '^jsx' && a:syntax_name !=? 'jsxEscapeJs' -endfunction - -" Whether the specified line is start with jsx-related syntax -function s:start_with_jsx(lnum) -  let start_syntax = s:start_syntax(a:lnum) -  return s:is_jsx(start_syntax) -endfunction - -" Whether the specified line is end with jsx-related syntax -function s:end_with_jsx(lnum) -  let end_syntax = s:end_syntax(a:lnum) -  return s:is_jsx(end_syntax) -endfunction - -" Whether the specified line is comment related syntax -function s:is_comment(syntax) -  return a:syntax =~? 'comment' -endfunction - -" Whether the specified line is embedded comment in jsxTag -function s:is_embedded_comment(lnum) -  let start_col = s:start_col(a:lnum) -  let syntax_stack = s:syntax_stack_at(a:lnum, start_col) -  let last = get(syntax_stack, -1) -  let last_2nd = get(syntax_stack, -2) - -  " Patch code for pangloss/vim-javascript -  " <div -  "   /* hello */ <-- syntax stack is [..., jsxTag, jsComment, jsComment] -  " > -  if last_2nd =~ 'comment' -    let last_2nd = get(syntax_stack, -3) -  endif - -  return last =~? 'comment' && last_2nd =~? 'jsxTag' && -        \ trim(getline(a:lnum)) =~ '\%(^/[*/]\)\|\%(\*/$\)' -endfunction -  " Whether the specified stytax group is the opening tag  function s:is_opening_tag(syntax)    return a:syntax =~? 'jsxOpenPunct' @@ -108,9 +60,9 @@ function s:is_closing_tag(syntax)    return a:syntax =~? 'jsxClose'  endfunction -" Whether the specified stytax group is the jsxAttrib -function s:is_jsx_attr(syntax) -  return a:syntax =~? 'jsxAttrib' +" Whether the specified syntax group is the jsxRegion +function s:is_jsx_region(syntax) +  return a:syntax =~? 'jsxRegion'  endfunction  " Whether the specified syntax group is the jsxElement @@ -118,9 +70,9 @@ function s:is_jsx_element(syntax)    return a:syntax =~? 'jsxElement'  endfunction -" Whether the specified syntax group is the jsxTag -function s:is_jsx_tag(syntax) -  return a:syntax =~? 'jsxTag' +" Whether the specified syntax group is the jsxEscapeJs +function s:is_jsx_escape(syntax) +  return a:syntax =~? 'jsxEscapeJs'  endfunction  " Whether the specified syntax group is the jsxBraces @@ -133,6 +85,11 @@ function s:is_jsx_comment(syntax)    return a:syntax =~? 'jsxComment'  endfunction +" Whether the specified line is comment related syntax +function s:is_comment(syntax) +  return a:syntax =~? 'comment' +endfunction +  " Whether the specified syntax group is the jsxComment  function s:is_jsx_backticks(syntax)    return a:syntax =~? 'jsxBackticks' @@ -143,155 +100,18 @@ function s:prev_lnum(lnum)    return prevnonblank(a:lnum - 1)  endfunction -" Given a lnum and get the information of its previous line -function s:prev_info(lnum) -  let prev_lnum = s:prev_lnum(a:lnum) -  let prev_start_syntax = s:start_syntax(prev_lnum) -  let prev_end_syntax = s:end_syntax(prev_lnum) - -  return [prev_lnum, prev_start_syntax, prev_end_syntax] -endfunction - -" Get the length difference between syntax stack a and b -function s:syntax_stack_length_compare(lnum_a, col_a, lnum_b, col_b) -  let stack_a = s:syntax_stack_at(a:lnum_a, a:col_a) -  let stack_b = s:syntax_stack_at(a:lnum_b, a:col_b) - -  return len(stack_a) - len(stack_b) +" Whether the given pos is the parent of the given element who has +" element_count jsxElement syntax +function s:is_parent_element(pos, element_count) +  let syntax_stack = s:syntax_stack_at(a:pos[0], a:pos[1]) +  return s:is_opening_tag(syntax_stack[-1]) && +        \ count(syntax_stack, 'jsxElement') <= a:element_count  endfunction -" Determine whether child is a element of parent -function s:is_element_of(parent_lnum, child_lnum) -  let parent_stack = s:syntax_stack_at(a:parent_lnum, s:start_col(a:parent_lnum)) -  let child_stack = s:syntax_stack_at(a:child_lnum, s:start_col(a:child_lnum)) - -  let element_index = len(child_stack) - index(reverse(child_stack), 'jsxElement') -  let rest = parent_stack[element_index:] - -  return index(rest, 'jsxElement') == -1 -endfunction - -" Compute the indention of the opening tag -function s:jsx_indent_opening_tag(lnum) -  let [prev_lnum, prev_start_syntax, prev_end_syntax] = s:prev_info(a:lnum) - -  " If current line is start with > -  if trim(getline(a:lnum)) =~ '^>' -    let pair_line = searchpair('<', '', '>', 'bW', 's:skip_if_not(a:lnum, "jsxOpenPunct", "jsxClose")') -    return indent(pair_line) -  endif - -  " If both the start and the end of the previous line are not jsx-related syntax -  " return ( -  "   <div></div> <-- -  " ) -  if !s:end_with_jsx(prev_lnum) && !s:start_with_jsx(prev_lnum) -    " return -1, so that it will use the default js indent function -    return -1 -  endif - -  " If the end of the previous line is not jsx-related syntax -  " [ -  "   <div></div>, -  "   <div></div> <-- -  " ] -  " should not affect -  " <div -  "   render={() => ( -  "     <div> <-- -  "     </div> -  "   )} -  " > -  " </div> -  " <div> -  "   {items.map(() => ( -  "     <Item /> <-- -  "   ))} -  " </div> -  if !s:end_with_jsx(prev_lnum) &&  -        \ !s:is_jsx_attr(prev_start_syntax) && -        \ !s:is_jsx_brace(prev_start_syntax) -    return indent(prev_lnum) -  endif - -  " If the start of the previous line is not jsx-related syntax -  " return <div> -  "   <div></div> <-- -  " </div> -  if !s:start_with_jsx(prev_lnum) -      return indent(prev_lnum) + s:sw() -    endif -  endif - -  " <div> -  "   <span> -  "   </span> -  "   <div> <-- -  "   </div> -  " </div> -  if s:is_closing_tag(prev_start_syntax) -    return indent(prev_lnum) -  endif - -  " If the previous line is end with a closing tag -  " <div> -  "   <br /> -  "   <div></div> <-- -  " </div> -  " should not affect case like -  " <div><br /> -  "   <span> <-- -  " </div> -  if s:is_closing_tag(prev_end_syntax) && -        \ s:syntax_stack_length_compare( -        \   prev_lnum, s:start_col(prev_lnum), prev_lnum, s:end_col(prev_lnum)) == 2 -    return indent(prev_lnum) -  endif - -  " If the start of the previous line is the jsxElement -  " <div> -  "   hello -  "   <div></div> <-- -  " </div> -  if s:is_jsx_element(prev_start_syntax) || -        \ s:is_jsx_comment(prev_start_syntax) -    return indent(prev_lnum) -  endif - -  " If the start of the prvious line is the jsxBraces { -  " <div> -  "   {foo} -  "   <div></div> <-- -  " </div> -  " should not affect case like -  " <div> -  "   { -  "     <div></div> <-- -  "   } -  " </div> -  if s:is_jsx_brace(prev_start_syntax) && -        \ trim(getline(prev_lnum)) =~ '^[$]\?{' && -        \ s:syntax_stack_length_compare( -        \ prev_lnum, s:start_col(prev_lnum), a:lnum, s:start_col(a:lnum)) == -2 -    return indent(prev_lnum) -  endif - -  " If the start of the prvious line is the jsxBraces } -  " <div> -  "   { -  "     foo -  "   } -  "   <div></div> <-- -  " </div> -  if s:is_jsx_brace(prev_start_syntax) && -        \ trim(getline(prev_lnum)) =~ '}' && -        \ s:syntax_stack_length_compare( -        \ prev_lnum, s:start_col(prev_lnum), a:lnum, s:start_col(a:lnum)) == -3 -    return indent(prev_lnum) -  endif - -  " Otherwise, indent s:sw() spaces -  return indent(prev_lnum) + s:sw() +" Compute the indention of the trail punct +function s:jsx_indent_trail_punct(lnum) +  let pair_line = searchpair('<', '', '>', 'bW', 's:skip_if_not(a:lnum, "jsxOpenPunct", "jsxClose")') +  return indent(pair_line)  endfunction  " Compute the indention of the closing tag @@ -300,195 +120,64 @@ function s:jsx_indent_closing_tag(lnum)    return pair_line ? indent(pair_line) : indent(a:lnum)  endfunction -" Compute the indention of the jsxAttrib -function s:jsx_indent_attr(lnum) -  let [prev_lnum, prev_start_syntax, prev_end_syntax] = s:prev_info(a:lnum) - -  " If the start of the previous line is not jsx-related syntax -  " return <div -  "   attr="hello" <-- -  " > -  " should not affect -  " <div -  "   // comment here -  "   attr="hello" -  " > -  " </div> -  if !s:start_with_jsx(prev_lnum) && -        \ !s:is_comment(prev_start_syntax) -    return indent(prev_lnum) + s:sw() -  endif - -  " If the start of the previous line is the opening tag -  " <div -  "   title="title" <-- -  " > -  if s:is_opening_tag(prev_start_syntax) -    return indent(prev_lnum) + s:sw() -  endif - -  " Otherwise, align the attribute with its previous line -  return indent(prev_lnum) -endfunction -  " Compute the indentation of the jsxElement  function s:jsx_indent_element(lnum) -  let [prev_lnum, prev_start_syntax, prev_end_syntax] = s:prev_info(a:lnum) - -  " Fix test case like -  " <div|> <-- press enter -  " should indent as -  " <div -  " > <-- -  if trim(getline(a:lnum)) =~ '^>' && !s:is_opening_tag(prev_end_syntax) -    return indent(prev_lnum) -  endif +  let syntax_stack = s:syntax_stack_at(a:lnum, s:start_col(a:lnum)) +  let syntax_name = syntax_stack[-1] +  let element_count = count(syntax_stack, 'jsxElement') -  " If the start of the previous line is start with > -  " <div -  "   attr="foo" -  " > -  "   text <-- -  " </div> -  if s:is_opening_tag(prev_start_syntax) && -        \ trim(getline(prev_lnum)) =~ '^>$' -    return indent(prev_lnum) + s:sw() +  if s:trim(getline(a:lnum)) =~ '^>' +    return s:jsx_indent_trail_punct(a:lnum)    endif -  " <div> -  "   text <-- -  " </div> -  " should not affect case like -  " <div> -  "   <br /> -  "   hello <-- -  " </div> -  if s:is_opening_tag(prev_start_syntax) && -        \ s:is_element_of(prev_lnum, a:lnum) -    return indent(prev_lnum) + s:sw() -  endif - -  " return <div> -  "   text <-- -  " </div> -  if !s:start_with_jsx(prev_lnum) -    return indent(prev_lnum) + s:sw() +  " If current tag is closing tag +  if s:is_closing_tag(syntax_name) +    return s:jsx_indent_closing_tag(a:lnum)    endif -  " Otherwise, align with the previous line -  " <div> -  "   {foo} -  "   text <-- -  " </div> -  return indent(prev_lnum) -endfunction - -" Compute the indentation of jsxBraces -function s:jsx_indent_brace(lnum) -  let [prev_lnum, prev_start_syntax, prev_end_syntax] = s:prev_info(a:lnum) -   -  " If the start of the previous line is start with > -  " <div -  "   attr="foo" -  " > -  "   {foo} <-- -  " </div> -  if s:is_opening_tag(prev_start_syntax) && -        \ trim(getline(prev_lnum)) =~ '^>$' -    return indent(prev_lnum) + s:sw() +  " Normalize the jsxElement count for opening tag +  if s:is_opening_tag(syntax_name) +    " <div> +    "   <div></div> <-- jsxRegion->jsxElement->jsxElement->jsxTag->jsxOpenTag->jsxOpenPunct +    " </div> +    if s:is_jsx_element(syntax_stack[-4]) && s:is_jsx_element(syntax_stack[-5]) +      let element_count = element_count - 1 +    endif    endif -  " <div> -  "   {foo} <-- -  " </div> -  " should not affect case like -  " <div> -  "   <br /> -  "   {foo} <-- -  "   text -  "   {foo} <-- -  " </div> -  if s:is_opening_tag(prev_start_syntax) && -        \ s:syntax_stack_length_compare( -        \ prev_lnum, s:start_col(prev_lnum), a:lnum, s:start_col(a:lnum)) == 1 -    return indent(prev_lnum) + s:sw() -  endif +  let start_time = localtime() +  let pos = searchpos(s:start_tag, 'bW') -  " If current line is the close brace } -  if trim(getline(a:lnum)) =~ '^}' -    let pair_line = searchpair('{', '', '}', 'bW', 's:skip_if_not(a:lnum, "jsxBraces")') -    return indent(pair_line) -  endif +  while !s:is_parent_element(pos, element_count) +    if localtime() - start_time >= 0.5 +      return -1 +    endif +    let pos = searchpos(s:start_tag, 'bW') +  endwhile -  " return <div> -  "   {foo} <-- -  " </div> -  " should not affect -  " <div -  "   // js comment -  "   {...props} <-- -  " > -  " </div> -  if !s:start_with_jsx(prev_lnum) && -        \ !s:is_comment(prev_start_syntax) -    return indent(prev_lnum) + s:sw() -  endif -   -  return indent(prev_lnum) +  return indent(pos[0]) + s:sw()  endfunction  " Compute the indentation of the comment  function s:jsx_indent_comment(lnum) -  let [prev_lnum, prev_start_syntax, prev_end_syntax] = s:prev_info(a:lnum) +  let line = s:trim(getline(a:lnum)) -  " If current line is jsxComment    if s:is_jsx_comment(s:start_syntax(a:lnum)) -    let line = trim(getline(a:lnum)) -    if line =~ '^<!--' -      " Patch code for yajs.vim -      " ${logs.map(log => html` -      "   <${Log} class="log" ...${log} /> -      " `)} <-- The backtick here is Highlighted as javascriptTemplate -      " <!-- <-- Correct the indentation here -      if !s:start_with_jsx(prev_lnum) && s:end_with_jsx(prev_lnum) -        return indent(prev_lnum) -      endif - -      " Return the element indent for the opening comment +    if line =~ '^<!--' || line =~ '^-->'        return s:jsx_indent_element(a:lnum) -    elseif line =~ '^-->' -      " Return the paired indent for the closing comment -      let pair_line = searchpair('<!--', '', '-->', 'bW') -      return indent(pair_line)      else -      if trim(getline(prev_lnum)) =~ '^<!--' -        " <!-- -        "   comment <-- -        " --> -        return indent(prev_lnum) + s:sw() -      else -        " <!-- -        "   comment -        "   comment <-- -        " --> -        return indent(prev_lnum) -      endif +      return s:jsx_indent_element(a:lnum) + s:sw() +    endif +  else +    if line =~ '^/\*' || line =~ '^//' +      return s:jsx_indent_element(a:lnum) +    else +      return s:jsx_indent_element(a:lnum) + 1      endif    endif - -  " For comment inside the jsxTag -  if s:is_opening_tag(prev_start_syntax) -    return indent(prev_lnum) + s:sw() -  endif - -  if trim(getline(a:lnum)) =~ '\*/$' -    let pair_line = searchpair('/\*', '', '\*/', 'bW', 's:skip_if_not(a:lnum)') -    return indent(pair_line) + 1 -  endif -   -  return indent(prev_lnum)  endfunction +" Compute the indentation of jsxBackticks  function s:jsx_indent_backticks(lnum)    let tags = get(g:, 'vim_jsx_pretty_template_tags', ['html', 'jsx'])    let start_tag = '\%(' . join(tags, '\|') . '\)`' @@ -498,116 +187,120 @@ function s:jsx_indent_backticks(lnum)    return indent(pair_line)  endfunction -" Compute the indentation for the jsx-related element -function s:jsx_indent(lnum) -  let start_syntax = s:start_syntax(a:lnum) +" Syntax context types: +" - jsxRegion +" - jsxTaggedRegion +" - jsxElement +" - jsxEscapeJs +" - Other +function s:syntax_context(lnum) +  let start_col = s:start_col(a:lnum) +  let syntax_stack = s:syntax_stack_at(a:lnum, start_col) +  let start_syntax = syntax_stack[-1] +  let reversed = reverse(syntax_stack) +  let i = 0 + +  for syntax_name in reversed +    " If the current line is jsxEscapeJs and not starts with jsxBraces +    if s:is_jsx_escape(syntax_name) +      return 'jsxEscapeJs' +    endif + +    if s:is_jsx_region(syntax_name) +      return 'jsxRegion' +    endif -  if s:is_opening_tag(start_syntax) -    return s:jsx_indent_opening_tag(a:lnum) -  elseif s:is_closing_tag(start_syntax) -    return s:jsx_indent_closing_tag(a:lnum) -  elseif s:is_jsx_attr(start_syntax) -    return s:jsx_indent_attr(a:lnum) -  elseif s:is_jsx_element(start_syntax) -    return s:jsx_indent_element(a:lnum) -  elseif s:is_jsx_brace(start_syntax) -    return s:jsx_indent_brace(a:lnum) -  elseif s:is_jsx_comment(start_syntax) -    return s:jsx_indent_comment(a:lnum) -  elseif s:is_jsx_backticks(start_syntax) -    return s:jsx_indent_backticks(a:lnum) -  endif +    if s:is_jsx_element(syntax_name) +      " If current line starts with the opening tag +      if s:is_opening_tag(start_syntax) || s:is_closing_tag(start_syntax) +        " And the next syntax is jsxRegion +        if s:is_jsx_region(reversed[i+1]) +          return 'jsxRegion' +        elseif reversed[i+1] =~ 'jsxTaggedRegion' +          return 'jsxTaggedRegion' +        else +          return 'jsxElement' +        endif +      elseif reversed[i+1] =~ 'jsxTaggedRegion' +        return 'jsxTaggedRegion' +      else +        return 'jsxElement' +      endif +    endif -  return -1 +    let i = i + 1 +  endfor +   +  return 'Other'  endfunction -" Return the jsx context of the specified line  -function s:jsx_context(lnum) -  if !s:end_with_jsx(prev_lnum) -    return 'non-jsx' + +function! jsx_pretty#indent#get(js_indent) +  let line = s:trim(getline(v:lnum)) +  let start_syntax = s:start_syntax(v:lnum) + +  if s:is_jsx_backticks(start_syntax) +    return s:jsx_indent_backticks(v:lnum)    endif -  let prev_lnum = s:prev_lnum(a:lnum) -  let start_syntax = s:start_syntax(prev_lnum) -  let end_col = s:end_col(prev_lnum) -  let end_syntax_stack = s:syntax_stack_at(prev_lnum, end_col) -  let reversed = reverse(end_syntax_stack) - -  for item in reversed -    if item =~? 'jsxEscapeJs' -      return 'unknown' -    elseif s:is_jsx_element(item) && s:is_jsx(start_syntax) && start_syntax !~? 'jsxEscapeJs' -      " <div> -      "   <br /> <-- press o -      " </div> -      " -------------------- -      " <div> -      " { -      "     a > 0 ? 1 <div>|</div> <-- press enter -      " } -      " </div> -      return 'jsxElement' -    elseif s:is_jsx_tag(item) -      return 'jsxTag' -    elseif s:is_jsx_brace(item) && trim(getline(prev_lnum)) =~ '{$' -      return 'jsxBraces' -    endif -  endfor +  if s:is_jsx_brace(start_syntax) +    return s:jsx_indent_element(v:lnum) +  endif -  return 'unknown' -endfunction +  if s:is_opening_tag(start_syntax) && line =~ '^>' +    return s:jsx_indent_trail_punct(v:lnum) +  endif + +  let syntax_context = s:syntax_context(v:lnum) + +  if syntax_context == 'jsxRegion' +    if s:is_closing_tag(start_syntax) +      return s:jsx_indent_closing_tag(v:lnum) +    endif -function! jsx_pretty#indent#get(js_indent) -  " The start column index of the current line (one-based) -  let start_col = s:start_col(v:lnum) -  " The end column index of the current line (one-based) -  let end_col = s:end_col(v:lnum) - -  if s:start_with_jsx(v:lnum) -    let ind = s:jsx_indent(v:lnum) -    return ind == -1 ? a:js_indent() : ind -  elseif s:is_embedded_comment(v:lnum) -    return s:jsx_indent_comment(v:lnum) -  else -    let line = trim(getline(v:lnum))      let prev_lnum = s:prev_lnum(v:lnum) +    let prev_line = s:trim(getline(prev_lnum)) -    " Fix the case where pressing enter at the cursor -    " return <div>|</div> -    if line =~ '^' . s:end_tag && -          \ s:end_with_jsx(s:prev_lnum(v:lnum)) +    if prev_line =~ '[([{=?]$' +      return indent(prev_lnum) + s:sw() +    elseif prev_line =~ '[:|&<>]$' && +          \ s:trim(getline(s:prev_lnum(prev_lnum))) !~ '[?:|&<>]$' +      return indent(prev_lnum) + s:sw() +    else +      return indent(prev_lnum) +    endif +  elseif syntax_context == 'jsxTaggedRegion' +    if s:is_closing_tag(start_syntax)        return s:jsx_indent_closing_tag(v:lnum) +    elseif s:is_jsx_comment(start_syntax) +      return s:jsx_indent_comment(v:lnum) +    else +      return indent(s:prev_lnum(v:lnum)) + s:sw() +    endif +  elseif syntax_context == 'jsxElement' +    if s:is_jsx_comment(start_syntax) +      return s:jsx_indent_comment(v:lnum)      endif -    " Fix cases for the new line -    if empty(line) -      let context = s:jsx_context(v:lnum) - -      if context == 'jsxElement' -        " <div> <-- press o -        " </div> -        return s:jsx_indent_element(v:lnum) -      elseif context == 'jsxTag' -        " <div <-- press o -        " > -        " </div> -        " ----------------------- -        " <div -        "   attr="attr" <-- press o -        " > -        " </div> -        return s:jsx_indent_attr(v:lnum) -      elseif context == 'jsxBraces' -        " <div> -        "   { <-- press o -        "   } -        " </div> -        return indent(prev_lnum) + s:sw() -      endif +    if s:is_comment(start_syntax) +      return s:jsx_indent_comment(v:lnum)      endif -    return a:js_indent() +    return s:jsx_indent_element(v:lnum) +  elseif syntax_context == 'jsxEscapeJs' +    let prev_lnum = s:prev_lnum(v:lnum) +    let prev_line = s:trim(getline(prev_lnum)) + +    if line =~ '^?' +      return indent(prev_lnum) + s:sw() +    elseif line =~ '^:' +      return indent(prev_lnum) +    else +      return a:js_indent() +    endif    endif + +  return a:js_indent()  endfunction  endif | 
