diff options
Diffstat (limited to 'indent/r.vim')
-rw-r--r-- | indent/r.vim | 525 |
1 files changed, 0 insertions, 525 deletions
diff --git a/indent/r.vim b/indent/r.vim deleted file mode 100644 index e23f8a24..00000000 --- a/indent/r.vim +++ /dev/null @@ -1,525 +0,0 @@ -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 |