diff options
| author | Adam Stankiewicz <sheerun@sher.pl> | 2017-09-27 20:43:42 +0200 | 
|---|---|---|
| committer | Adam Stankiewicz <sheerun@sher.pl> | 2017-09-27 20:43:42 +0200 | 
| commit | 5b77877888162f4e415fe9a7b8c5e9fb5dfb6ee1 (patch) | |
| tree | 965ae5128797f3d42d78d02692e62d24a4596e19 /indent/r.vim | |
| parent | 8148255ef1c416f414c3a78405eff08fe149d16e (diff) | |
| download | vim-polyglot-5b77877888162f4e415fe9a7b8c5e9fb5dfb6ee1.tar.gz vim-polyglot-5b77877888162f4e415fe9a7b8c5e9fb5dfb6ee1.zip | |
Add syntax files from upstream vim repository
Diffstat (limited to '')
| -rw-r--r-- | indent/r.vim | 525 | 
1 files changed, 525 insertions, 0 deletions
| diff --git a/indent/r.vim b/indent/r.vim new file mode 100644 index 00000000..e23f8a24 --- /dev/null +++ b/indent/r.vim @@ -0,0 +1,525 @@ +if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'vim') == -1 +   +" Vim indent file +" Language:	R +" Author:	Jakson Alves de Aquino <jalvesaq@gmail.com> +" Homepage:     https://github.com/jalvesaq/R-Vim-runtime +" Last Change:	Thu Feb 18, 2016  06:32AM + + +" Only load this indent file when no other was loaded. +if exists("b:did_indent") +  finish +endif +let b:did_indent = 1 + +setlocal indentkeys=0{,0},:,!^F,o,O,e +setlocal indentexpr=GetRIndent() + +" Only define the function once. +if exists("*GetRIndent") +  finish +endif + +" Options to make the indentation more similar to Emacs/ESS: +if !exists("g:r_indent_align_args") +  let g:r_indent_align_args = 1 +endif +if !exists("g:r_indent_ess_comments") +  let g:r_indent_ess_comments = 0 +endif +if !exists("g:r_indent_comment_column") +  let g:r_indent_comment_column = 40 +endif +if ! exists("g:r_indent_ess_compatible") +  let g:r_indent_ess_compatible = 0 +endif +if ! exists("g:r_indent_op_pattern") +  let g:r_indent_op_pattern = '\(&\||\|+\|-\|\*\|/\|=\|\~\|%\|->\)\s*$' +endif + +function s:RDelete_quotes(line) +  let i = 0 +  let j = 0 +  let line1 = "" +  let llen = strlen(a:line) +  while i < llen +    if a:line[i] == '"' +      let i += 1 +      let line1 = line1 . 's' +      while !(a:line[i] == '"' && ((i > 1 && a:line[i-1] == '\' && a:line[i-2] == '\') || a:line[i-1] != '\')) && i < llen +        let i += 1 +      endwhile +      if a:line[i] == '"' +        let i += 1 +      endif +    else +      if a:line[i] == "'" +        let i += 1 +        let line1 = line1 . 's' +        while !(a:line[i] == "'" && ((i > 1 && a:line[i-1] == '\' && a:line[i-2] == '\') || a:line[i-1] != '\')) && i < llen +          let i += 1 +        endwhile +        if a:line[i] == "'" +          let i += 1 +        endif +      else +        if a:line[i] == "`" +          let i += 1 +          let line1 = line1 . 's' +          while a:line[i] != "`" && i < llen +            let i += 1 +          endwhile +          if a:line[i] == "`" +            let i += 1 +          endif +        endif +      endif +    endif +    if i == llen +      break +    endif +    let line1 = line1 . a:line[i] +    let j += 1 +    let i += 1 +  endwhile +  return line1 +endfunction + +" Convert foo(bar()) int foo() +function s:RDelete_parens(line) +  if s:Get_paren_balance(a:line, "(", ")") != 0 +    return a:line +  endif +  let i = 0 +  let j = 0 +  let line1 = "" +  let llen = strlen(a:line) +  while i < llen +    let line1 = line1 . a:line[i] +    if a:line[i] == '(' +      let nop = 1 +      while nop > 0 && i < llen +        let i += 1 +        if a:line[i] == ')' +          let nop -= 1 +        else +          if a:line[i] == '(' +            let nop += 1 +          endif +        endif +      endwhile +      let line1 = line1 . a:line[i] +    endif +    let i += 1 +  endwhile +  return line1 +endfunction + +function! s:Get_paren_balance(line, o, c) +  let line2 = substitute(a:line, a:o, "", "g") +  let openp = strlen(a:line) - strlen(line2) +  let line3 = substitute(line2, a:c, "", "g") +  let closep = strlen(line2) - strlen(line3) +  return openp - closep +endfunction + +function! s:Get_matching_brace(linenr, o, c, delbrace) +  let line = SanitizeRLine(getline(a:linenr)) +  if a:delbrace == 1 +    let line = substitute(line, '{$', "", "") +  endif +  let pb = s:Get_paren_balance(line, a:o, a:c) +  let i = a:linenr +  while pb != 0 && i > 1 +    let i -= 1 +    let pb += s:Get_paren_balance(SanitizeRLine(getline(i)), a:o, a:c) +  endwhile +  return i +endfunction + +" This function is buggy because there 'if's without 'else' +" It must be rewritten relying more on indentation +function! s:Get_matching_if(linenr, delif) +  let line = SanitizeRLine(getline(a:linenr)) +  if a:delif +    let line = substitute(line, "if", "", "g") +  endif +  let elsenr = 0 +  let i = a:linenr +  let ifhere = 0 +  while i > 0 +    let line2 = substitute(line, '\<else\>', "xxx", "g") +    let elsenr += strlen(line) - strlen(line2) +    if line =~ '.*\s*if\s*()' || line =~ '.*\s*if\s*()' +      let elsenr -= 1 +      if elsenr == 0 +        let ifhere = i +        break +      endif +    endif +    let i -= 1 +    let line = SanitizeRLine(getline(i)) +  endwhile +  if ifhere +    return ifhere +  else +    return a:linenr +  endif +endfunction + +function! s:Get_last_paren_idx(line, o, c, pb) +  let blc = a:pb +  let line = substitute(a:line, '\t', s:curtabstop, "g") +  let theidx = -1 +  let llen = strlen(line) +  let idx = 0 +  while idx < llen +    if line[idx] == a:o +      let blc -= 1 +      if blc == 0 +        let theidx = idx +      endif +    else +      if line[idx] == a:c +        let blc += 1 +      endif +    endif +    let idx += 1 +  endwhile +  return theidx + 1 +endfunction + +" Get previous relevant line. Search back until getting a line that isn't +" comment or blank +function s:Get_prev_line(lineno) +  let lnum = a:lineno - 1 +  let data = getline( lnum ) +  while lnum > 0 && (data =~ '^\s*#' || data =~ '^\s*$') +    let lnum = lnum - 1 +    let data = getline( lnum ) +  endwhile +  return lnum +endfunction + +" This function is also used by r-plugin/common_global.vim +" Delete from '#' to the end of the line, unless the '#' is inside a string. +function SanitizeRLine(line) +  let newline = s:RDelete_quotes(a:line) +  let newline = s:RDelete_parens(newline) +  let newline = substitute(newline, '#.*', "", "") +  let newline = substitute(newline, '\s*$', "", "") +  if &filetype == "rhelp" && newline =~ '^\\method{.*}{.*}(.*' +    let newline = substitute(newline, '^\\method{\(.*\)}{.*}', '\1', "") +  endif +  return newline +endfunction + +function GetRIndent() + +  let clnum = line(".")    " current line + +  let cline = getline(clnum) +  if cline =~ '^\s*#' +    if g:r_indent_ess_comments == 1 +      if cline =~ '^\s*###' +        return 0 +      endif +      if cline !~ '^\s*##' +        return g:r_indent_comment_column +      endif +    endif +  endif + +  let cline = SanitizeRLine(cline) + +  if cline =~ '^\s*}' || cline =~ '^\s*}\s*)$' +    let indline = s:Get_matching_brace(clnum, '{', '}', 1) +    if indline > 0 && indline != clnum +      let iline = SanitizeRLine(getline(indline)) +      if s:Get_paren_balance(iline, "(", ")") == 0 || iline =~ '(\s*{$' +        return indent(indline) +      else +        let indline = s:Get_matching_brace(indline, '(', ')', 1) +        return indent(indline) +      endif +    endif +  endif + +  " Find the first non blank line above the current line +  let lnum = s:Get_prev_line(clnum) +  " Hit the start of the file, use zero indent. +  if lnum == 0 +    return 0 +  endif + +  let line = SanitizeRLine(getline(lnum)) + +  if &filetype == "rhelp" +    if cline =~ '^\\dontshow{' || cline =~ '^\\dontrun{' || cline =~ '^\\donttest{' || cline =~ '^\\testonly{' +      return 0 +    endif +    if line =~ '^\\examples{' || line =~ '^\\usage{' || line =~ '^\\dontshow{' || line =~ '^\\dontrun{' || line =~ '^\\donttest{' || line =~ '^\\testonly{' +      return 0 +    endif +  endif + +  if &filetype == "rnoweb" && line =~ "^<<.*>>=" +    return 0 +  endif + +  if cline =~ '^\s*{' && s:Get_paren_balance(cline, '{', '}') > 0 +    if g:r_indent_ess_compatible && line =~ ')$' +      let nlnum = lnum +      let nline = line +      while s:Get_paren_balance(nline, '(', ')') < 0 +        let nlnum = s:Get_prev_line(nlnum) +        let nline = SanitizeRLine(getline(nlnum)) . nline +      endwhile +      if nline =~ '^\s*function\s*(' && indent(nlnum) == shiftwidth() +        return 0 +      endif +    endif +    if s:Get_paren_balance(line, "(", ")") == 0 +      return indent(lnum) +    endif +  endif + +  " line is an incomplete command: +  if line =~ '\<\(if\|while\|for\|function\)\s*()$' || line =~ '\<else$' || line =~ '<-$' || line =~ '->$' +    return indent(lnum) + shiftwidth() +  endif + +  " Deal with () and [] + +  let pb = s:Get_paren_balance(line, '(', ')') + +  if line =~ '^\s*{$' || line =~ '(\s*{' || (pb == 0 && (line =~ '{$' || line =~ '(\s*{$')) +    return indent(lnum) + shiftwidth() +  endif + +  let s:curtabstop = repeat(' ', &tabstop) + +  if g:r_indent_align_args == 1 +    if pb > 0 && line =~ '{$' +      return s:Get_last_paren_idx(line, '(', ')', pb) + shiftwidth() +    endif + +    let bb = s:Get_paren_balance(line, '[', ']') + +    if pb > 0 +      if &filetype == "rhelp" +        let ind = s:Get_last_paren_idx(line, '(', ')', pb) +      else +        let ind = s:Get_last_paren_idx(getline(lnum), '(', ')', pb) +      endif +      return ind +    endif + +    if pb < 0 && line =~ '.*[,&|\-\*+<>]$' +      let lnum = s:Get_prev_line(lnum) +      while pb < 1 && lnum > 0 +        let line = SanitizeRLine(getline(lnum)) +        let line = substitute(line, '\t', s:curtabstop, "g") +        let ind = strlen(line) +        while ind > 0 +          if line[ind] == ')' +            let pb -= 1 +          else +            if line[ind] == '(' +              let pb += 1 +            endif +          endif +          if pb == 1 +            return ind + 1 +          endif +          let ind -= 1 +        endwhile +        let lnum -= 1 +      endwhile +      return 0 +    endif + +    if bb > 0 +      let ind = s:Get_last_paren_idx(getline(lnum), '[', ']', bb) +      return ind +    endif +  endif + +  let post_block = 0 +  if line =~ '}$' && s:Get_paren_balance(line, '{', '}') < 0 +    let lnum = s:Get_matching_brace(lnum, '{', '}', 0) +    let line = SanitizeRLine(getline(lnum)) +    if lnum > 0 && line =~ '^\s*{' +      let lnum = s:Get_prev_line(lnum) +      let line = SanitizeRLine(getline(lnum)) +    endif +    let pb = s:Get_paren_balance(line, '(', ')') +    let post_block = 1 +  endif + +  " Indent after operator pattern +  let olnum = s:Get_prev_line(lnum) +  let oline = getline(olnum) +  if olnum > 0 +    if line =~ g:r_indent_op_pattern && s:Get_paren_balance(line, "(", ")") == 0 +      if oline =~ g:r_indent_op_pattern && s:Get_paren_balance(line, "(", ")") == 0 +        return indent(lnum) +      else +        return indent(lnum) + shiftwidth() +      endif +    else +      if oline =~ g:r_indent_op_pattern && s:Get_paren_balance(line, "(", ")") == 0 +        return indent(lnum) - shiftwidth() +      endif +    endif +  endif + +  let post_fun = 0 +  if pb < 0 && line !~ ')\s*[,&|\-\*+<>]$' +    let post_fun = 1 +    while pb < 0 && lnum > 0 +      let lnum -= 1 +      let linepiece = SanitizeRLine(getline(lnum)) +      let pb += s:Get_paren_balance(linepiece, "(", ")") +      let line = linepiece . line +    endwhile +    if line =~ '{$' && post_block == 0 +      return indent(lnum) + shiftwidth() +    endif + +    " Now we can do some tests again +    if cline =~ '^\s*{' +      return indent(lnum) +    endif +    if post_block == 0 +      let newl = SanitizeRLine(line) +      if newl =~ '\<\(if\|while\|for\|function\)\s*()$' || newl =~ '\<else$' || newl =~ '<-$' +        return indent(lnum) + shiftwidth() +      endif +    endif +  endif + +  if cline =~ '^\s*else' +    if line =~ '<-\s*if\s*()' +      return indent(lnum) + shiftwidth() +    else +      if line =~ '\<if\s*()' +        return indent(lnum) +      else +        return indent(lnum) - shiftwidth() +      endif +    endif +  endif + +  let bb = s:Get_paren_balance(line, '[', ']') +  if bb < 0 && line =~ '.*]' +    while bb < 0 && lnum > 0 +      let lnum -= 1 +      let linepiece = SanitizeRLine(getline(lnum)) +      let bb += s:Get_paren_balance(linepiece, "[", "]") +      let line = linepiece . line +    endwhile +    let line = s:RDelete_parens(line) +  endif + +  let plnum = s:Get_prev_line(lnum) +  let ppost_else = 0 +  if plnum > 0 +    let pline = SanitizeRLine(getline(plnum)) +    let ppost_block = 0 +    if pline =~ '}$' +      let ppost_block = 1 +      let plnum = s:Get_matching_brace(plnum, '{', '}', 0) +      let pline = SanitizeRLine(getline(plnum)) +      if pline =~ '^\s*{$' && plnum > 0 +        let plnum = s:Get_prev_line(plnum) +        let pline = SanitizeRLine(getline(plnum)) +      endif +    endif + +    if pline =~ 'else$' +      let ppost_else = 1 +      let plnum = s:Get_matching_if(plnum, 0) +      let pline = SanitizeRLine(getline(plnum)) +    endif + +    if pline =~ '^\s*else\s*if\s*(' +      let pplnum = s:Get_prev_line(plnum) +      let ppline = SanitizeRLine(getline(pplnum)) +      while ppline =~ '^\s*else\s*if\s*(' || ppline =~ '^\s*if\s*()\s*\S$' +        let plnum = pplnum +        let pline = ppline +        let pplnum = s:Get_prev_line(plnum) +        let ppline = SanitizeRLine(getline(pplnum)) +      endwhile +      while ppline =~ '\<\(if\|while\|for\|function\)\s*()$' || ppline =~ '\<else$' || ppline =~ '<-$' +        let plnum = pplnum +        let pline = ppline +        let pplnum = s:Get_prev_line(plnum) +        let ppline = SanitizeRLine(getline(pplnum)) +      endwhile +    endif + +    let ppb = s:Get_paren_balance(pline, '(', ')') +    if ppb < 0 && (pline =~ ')\s*{$' || pline =~ ')$') +      while ppb < 0 && plnum > 0 +        let plnum -= 1 +        let linepiece = SanitizeRLine(getline(plnum)) +        let ppb += s:Get_paren_balance(linepiece, "(", ")") +        let pline = linepiece . pline +      endwhile +      let pline = s:RDelete_parens(pline) +    endif +  endif + +  let ind = indent(lnum) + +  if g:r_indent_align_args == 0 && pb != 0 +    let ind += pb * shiftwidth() +    return ind +  endif + +  if g:r_indent_align_args == 0 && bb != 0 +    let ind += bb * shiftwidth() +    return ind +  endif + +  if plnum > 0 +    let pind = indent(plnum) +  else +    let pind = 0 +  endif + +  if ind == pind || (ind == (pind  + shiftwidth()) && pline =~ '{$' && ppost_else == 0) +    return ind +  endif + +  let pline = getline(plnum) +  let pbb = s:Get_paren_balance(pline, '[', ']') + +  while pind < ind && plnum > 0 && ppb == 0 && pbb == 0 +    let ind = pind +    let plnum = s:Get_prev_line(plnum) +    let pline = getline(plnum) +    let ppb = s:Get_paren_balance(pline, '(', ')') +    let pbb = s:Get_paren_balance(pline, '[', ']') +    while pline =~ '^\s*else' +      let plnum = s:Get_matching_if(plnum, 1) +      let pline = getline(plnum) +      let ppb = s:Get_paren_balance(pline, '(', ')') +      let pbb = s:Get_paren_balance(pline, '[', ']') +    endwhile +    let pind = indent(plnum) +    if ind == (pind  + shiftwidth()) && pline =~ '{$' +      return ind +    endif +  endwhile + +  return ind + +endfunction + +" vim: sw=2 + +endif | 
