Merge pull request #2341 from jalvesaq/r-runtime-update

Update R runtime files
This commit is contained in:
Florian Walch 2015-04-05 15:55:43 +03:00
commit abf9bb63fe
5 changed files with 461 additions and 429 deletions

View File

@ -1,12 +1,12 @@
" Vim indent file " Vim indent file
" Language: R " Language: R
" Author: Jakson Alves de Aquino <jalvesaq@gmail.com> " Author: Jakson Alves de Aquino <jalvesaq@gmail.com>
" Last Change: Fri Feb 15, 2013 08:11PM " Last Change: Thu Mar 26, 2015 05:36PM
" Only load this indent file when no other was loaded. " Only load this indent file when no other was loaded.
if exists("b:did_indent") if exists("b:did_indent")
finish finish
endif endif
let b:did_indent = 1 let b:did_indent = 1
@ -15,478 +15,501 @@ setlocal indentexpr=GetRIndent()
" Only define the function once. " Only define the function once.
if exists("*GetRIndent") if exists("*GetRIndent")
finish finish
endif endif
" Options to make the indentation more similar to Emacs/ESS: " Options to make the indentation more similar to Emacs/ESS:
if !exists("g:r_indent_align_args") if !exists("g:r_indent_align_args")
let g:r_indent_align_args = 1 let g:r_indent_align_args = 1
endif endif
if !exists("g:r_indent_ess_comments") if !exists("g:r_indent_ess_comments")
let g:r_indent_ess_comments = 0 let g:r_indent_ess_comments = 0
endif endif
if !exists("g:r_indent_comment_column") if !exists("g:r_indent_comment_column")
let g:r_indent_comment_column = 40 let g:r_indent_comment_column = 40
endif endif
if ! exists("g:r_indent_ess_compatible") if ! exists("g:r_indent_ess_compatible")
let g:r_indent_ess_compatible = 0 let g:r_indent_ess_compatible = 0
endif
if ! exists("g:r_indent_op_pattern")
let g:r_indent_op_pattern = '\(+\|-\|\*\|/\|=\|\~\|%\)$'
endif endif
function s:RDelete_quotes(line) function s:RDelete_quotes(line)
let i = 0 let i = 0
let j = 0 let j = 0
let line1 = "" let line1 = ""
let llen = strlen(a:line) let llen = strlen(a:line)
while i < llen while i < llen
if a:line[i] == '"' if a:line[i] == '"'
let i += 1 let i += 1
let line1 = line1 . 's' let line1 = line1 . 's'
while !(a:line[i] == '"' && ((i > 1 && a:line[i-1] == '\' && a:line[i-2] == '\') || a:line[i-1] != '\')) && i < llen 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 let i += 1
endwhile endwhile
return line1 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 endfunction
" Convert foo(bar()) int foo() " Convert foo(bar()) int foo()
function s:RDelete_parens(line) function s:RDelete_parens(line)
if s:Get_paren_balance(a:line, "(", ")") != 0 if s:Get_paren_balance(a:line, "(", ")") != 0
return a:line return a:line
endif endif
let i = 0 let i = 0
let j = 0 let j = 0
let line1 = "" let line1 = ""
let llen = strlen(a:line) let llen = strlen(a:line)
while i < llen while i < llen
let line1 = line1 . a:line[i] let line1 = line1 . a:line[i]
if a:line[i] == '(' if a:line[i] == '('
let nop = 1 let nop = 1
while nop > 0 && i < llen 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 let i += 1
endwhile if a:line[i] == ')'
return line1 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 endfunction
function! s:Get_paren_balance(line, o, c) function! s:Get_paren_balance(line, o, c)
let line2 = substitute(a:line, a:o, "", "g") let line2 = substitute(a:line, a:o, "", "g")
let openp = strlen(a:line) - strlen(line2) let openp = strlen(a:line) - strlen(line2)
let line3 = substitute(line2, a:c, "", "g") let line3 = substitute(line2, a:c, "", "g")
let closep = strlen(line2) - strlen(line3) let closep = strlen(line2) - strlen(line3)
return openp - closep return openp - closep
endfunction endfunction
function! s:Get_matching_brace(linenr, o, c, delbrace) function! s:Get_matching_brace(linenr, o, c, delbrace)
let line = SanitizeRLine(getline(a:linenr)) let line = SanitizeRLine(getline(a:linenr))
if a:delbrace == 1 if a:delbrace == 1
let line = substitute(line, '{$', "", "") let line = substitute(line, '{$', "", "")
endif endif
let pb = s:Get_paren_balance(line, a:o, a:c) let pb = s:Get_paren_balance(line, a:o, a:c)
let i = a:linenr let i = a:linenr
while pb != 0 && i > 1 while pb != 0 && i > 1
let i -= 1 let i -= 1
let pb += s:Get_paren_balance(SanitizeRLine(getline(i)), a:o, a:c) let pb += s:Get_paren_balance(SanitizeRLine(getline(i)), a:o, a:c)
endwhile endwhile
return i return i
endfunction endfunction
" This function is buggy because there 'if's without 'else' " This function is buggy because there 'if's without 'else'
" It must be rewritten relying more on indentation " It must be rewritten relying more on indentation
function! s:Get_matching_if(linenr, delif) function! s:Get_matching_if(linenr, delif)
" let filenm = expand("%") let line = SanitizeRLine(getline(a:linenr))
" call writefile([filenm], "/tmp/matching_if_" . a:linenr) if a:delif
let line = SanitizeRLine(getline(a:linenr)) let line = substitute(line, "if", "", "g")
if a:delif endif
let line = substitute(line, "if", "", "g") let elsenr = 0
endif let i = a:linenr
let elsenr = 0 let ifhere = 0
let i = a:linenr while i > 0
let ifhere = 0 let line2 = substitute(line, '\<else\>', "xxx", "g")
while i > 0 let elsenr += strlen(line) - strlen(line2)
let line2 = substitute(line, '\<else\>', "xxx", "g") if line =~ '.*\s*if\s*()' || line =~ '.*\s*if\s*()'
let elsenr += strlen(line) - strlen(line2) let elsenr -= 1
if line =~ '.*\s*if\s*()' || line =~ '.*\s*if\s*()' if elsenr == 0
let elsenr -= 1 let ifhere = i
if elsenr == 0 break
let ifhere = i endif
break
endif
endif
let i -= 1
let line = SanitizeRLine(getline(i))
endwhile
if ifhere
return ifhere
else
return a:linenr
endif endif
let i -= 1
let line = SanitizeRLine(getline(i))
endwhile
if ifhere
return ifhere
else
return a:linenr
endif
endfunction endfunction
function! s:Get_last_paren_idx(line, o, c, pb) function! s:Get_last_paren_idx(line, o, c, pb)
let blc = a:pb let blc = a:pb
let line = substitute(a:line, '\t', s:curtabstop, "g") let line = substitute(a:line, '\t', s:curtabstop, "g")
let theidx = -1 let theidx = -1
let llen = strlen(line) let llen = strlen(line)
let idx = 0 let idx = 0
while idx < llen while idx < llen
if line[idx] == a:o if line[idx] == a:o
let blc -= 1 let blc -= 1
if blc == 0 if blc == 0
let theidx = idx let theidx = idx
endif endif
else else
if line[idx] == a:c if line[idx] == a:c
let blc += 1 let blc += 1
endif endif
endif endif
let idx += 1 let idx += 1
endwhile endwhile
return theidx + 1 return theidx + 1
endfunction endfunction
" Get previous relevant line. Search back until getting a line that isn't " Get previous relevant line. Search back until getting a line that isn't
" comment or blank " comment or blank
function s:Get_prev_line(lineno) function s:Get_prev_line(lineno)
let lnum = a:lineno - 1 let lnum = a:lineno - 1
let data = getline( lnum )
while lnum > 0 && (data =~ '^\s*#' || data =~ '^\s*$')
let lnum = lnum - 1
let data = getline( lnum ) let data = getline( lnum )
while lnum > 0 && (data =~ '^\s*#' || data =~ '^\s*$') endwhile
let lnum = lnum - 1 return lnum
let data = getline( lnum )
endwhile
return lnum
endfunction endfunction
" This function is also used by r-plugin/common_global.vim " 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. " Delete from '#' to the end of the line, unless the '#' is inside a string.
function SanitizeRLine(line) function SanitizeRLine(line)
let newline = s:RDelete_quotes(a:line) let newline = s:RDelete_quotes(a:line)
let newline = s:RDelete_parens(newline) let newline = s:RDelete_parens(newline)
let newline = substitute(newline, '#.*', "", "") let newline = substitute(newline, '#.*', "", "")
let newline = substitute(newline, '\s*$', "", "") let newline = substitute(newline, '\s*$', "", "")
return newline if &filetype == "rhelp" && newline =~ '^\\method{.*}{.*}(.*'
let newline = substitute(newline, '^\\method{\(.*\)}{.*}', '\1', "")
endif
return newline
endfunction endfunction
function GetRIndent() function GetRIndent()
let clnum = line(".") " current line let clnum = line(".") " current line
let cline = getline(clnum) let cline = getline(clnum)
if cline =~ '^\s*#' if cline =~ '^\s*#'
if g:r_indent_ess_comments == 1 if g:r_indent_ess_comments == 1
if cline =~ '^\s*###' 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 return 0
endif
if cline !~ '^\s*##'
return g:r_indent_comment_column
endif
endif endif
endif
let line = SanitizeRLine(getline(lnum)) let cline = SanitizeRLine(cline)
if &filetype == "rhelp" if cline =~ '^\s*}' || cline =~ '^\s*}\s*)$'
if cline =~ '^\\dontshow{' || cline =~ '^\\dontrun{' || cline =~ '^\\donttest{' || cline =~ '^\\testonly{' let indline = s:Get_matching_brace(clnum, '{', '}', 1)
return 0 if indline > 0 && indline != clnum
endif let iline = SanitizeRLine(getline(indline))
if line =~ '^\\examples{' || line =~ '^\\usage{' || line =~ '^\\dontshow{' || line =~ '^\\dontrun{' || line =~ '^\\donttest{' || line =~ '^\\testonly{' if s:Get_paren_balance(iline, "(", ")") == 0 || iline =~ '(\s*{$'
return 0 return indent(indline)
endif else
if line =~ '^\\method{.*}{.*}(.*' let indline = s:Get_matching_brace(indline, '(', ')', 1)
let line = substitute(line, '^\\method{\(.*\)}{.*}', '\1', "") return indent(indline)
endif endif
endif endif
endif
if cline =~ '^\s*{' " Find the first non blank line above the current line
if g:r_indent_ess_compatible && line =~ ')$' let lnum = s:Get_prev_line(clnum)
let nlnum = lnum " Hit the start of the file, use zero indent.
let nline = line if lnum == 0
while s:Get_paren_balance(nline, '(', ')') < 0 return 0
let nlnum = s:Get_prev_line(nlnum) endif
let nline = SanitizeRLine(getline(nlnum)) . nline
endwhile let line = SanitizeRLine(getline(lnum))
if nline =~ '^\s*function\s*(' && indent(nlnum) == &sw
return 0 if &filetype == "rhelp"
endif if cline =~ '^\\dontshow{' || cline =~ '^\\dontrun{' || cline =~ '^\\donttest{' || cline =~ '^\\testonly{'
endif return 0
if s:Get_paren_balance(line, "(", ")") == 0
return indent(lnum)
endif
endif endif
if line =~ '^\\examples{' || line =~ '^\\usage{' || line =~ '^\\dontshow{' || line =~ '^\\dontrun{' || line =~ '^\\donttest{' || line =~ '^\\testonly{'
" line is an incomplete command: return 0
if line =~ '\<\(if\|while\|for\|function\)\s*()$' || line =~ '\<else$' || line =~ '<-$'
return indent(lnum) + &sw
endif endif
endif
" Deal with () and [] if &filetype == "rnoweb" && line =~ "^<<.*>>="
return 0
endif
let pb = s:Get_paren_balance(line, '(', ')') if cline =~ '^\s*{'
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) == &sw
return 0
endif
endif
if s:Get_paren_balance(line, "(", ")") == 0
return indent(lnum)
endif
endif
if line =~ '^\s*{$' || line =~ '(\s*{' || (pb == 0 && (line =~ '{$' || line =~ '(\s*{$')) " line is an incomplete command:
return indent(lnum) + &sw if line =~ '\<\(if\|while\|for\|function\)\s*()$' || line =~ '\<else$' || line =~ '<-$'
return indent(lnum) + &sw
endif
" Deal with () and []
let pb = s:Get_paren_balance(line, '(', ')')
if line =~ '^\s*{$' || line =~ '(\s*{' || (pb == 0 && (line =~ '{$' || line =~ '(\s*{$'))
return indent(lnum) + &sw
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) + &sw
endif endif
let bb = s:Get_paren_balance(line, '[', ']') let bb = s:Get_paren_balance(line, '[', ']')
let s:curtabstop = repeat(' ', &tabstop) if pb > 0
if g:r_indent_align_args == 1 if &filetype == "rhelp"
let ind = s:Get_last_paren_idx(line, '(', ')', pb)
if pb == 0 && bb == 0 && (line =~ '.*[,&|\-\*+<>]$' || cline =~ '^\s*[,&|\-\*+<>]') else
return indent(lnum) let ind = s:Get_last_paren_idx(getline(lnum), '(', ')', pb)
endif endif
return ind
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 endif
let post_block = 0 if pb < 0 && line =~ '.*[,&|\-\*+<>]$'
if line =~ '}$' let lnum = s:Get_prev_line(lnum)
let lnum = s:Get_matching_brace(lnum, '{', '}', 0) while pb < 1 && lnum > 0
let line = SanitizeRLine(getline(lnum)) let line = SanitizeRLine(getline(lnum))
if lnum > 0 && line =~ '^\s*{' let line = substitute(line, '\t', s:curtabstop, "g")
let lnum = s:Get_prev_line(lnum) let ind = strlen(line)
let line = SanitizeRLine(getline(lnum)) while ind > 0
endif if line[ind] == ')'
let pb = s:Get_paren_balance(line, '(', ')') let pb -= 1
let post_block = 1 else
endif if line[ind] == '('
let pb += 1
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) + &sw
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) + &sw
endif endif
endif endif
endif if pb == 1
return ind + 1
if cline =~ '^\s*else' endif
if line =~ '<-\s*if\s*()' let ind -= 1
return indent(lnum) + &sw
else
if line =~ '\<if\s*()'
return indent(lnum)
else
return indent(lnum) - &sw
endif
endif
endif
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 endwhile
let line = s:RDelete_parens(line) let lnum -= 1
endwhile
return 0
endif endif
let plnum = s:Get_prev_line(lnum) if bb > 0
let ppost_else = 0 let ind = s:Get_last_paren_idx(getline(lnum), '[', ']', bb)
if plnum > 0 return ind
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 endif
endif
let ind = indent(lnum) let post_block = 0
let pind = indent(plnum) if line =~ '}$'
let lnum = s:Get_matching_brace(lnum, '{', '}', 0)
if g:r_indent_align_args == 0 && pb != 0 let line = SanitizeRLine(getline(lnum))
let ind += pb * &sw if lnum > 0 && line =~ '^\s*{'
return ind let lnum = s:Get_prev_line(lnum)
let line = SanitizeRLine(getline(lnum))
endif endif
let pb = s:Get_paren_balance(line, '(', ')')
let post_block = 1
endif
if g:r_indent_align_args == 0 && bb != 0 " Indent after operator pattern
let ind += bb * &sw let olnum = s:Get_prev_line(lnum)
return ind let oline = getline(olnum)
if olnum > 0
if line =~ g:r_indent_op_pattern
if oline =~ g:r_indent_op_pattern
return indent(lnum)
else
return indent(lnum) + &sw
endif
else
if oline =~ g:r_indent_op_pattern
return indent(lnum) - &sw
endif
endif endif
endif
if ind == pind || (ind == (pind + &sw) && pline =~ '{$' && ppost_else == 0) let post_fun = 0
return ind if pb < 0 && line !~ ')\s*[,&|\-\*+<>]$'
endif let post_fun = 1
while pb < 0 && lnum > 0
let pline = getline(plnum) let lnum -= 1
let pbb = s:Get_paren_balance(pline, '[', ']') let linepiece = SanitizeRLine(getline(lnum))
let pb += s:Get_paren_balance(linepiece, "(", ")")
while pind < ind && plnum > 0 && ppb == 0 && pbb == 0 let line = linepiece . line
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 + &sw) && pline =~ '{$'
return ind
endif
endwhile endwhile
if line =~ '{$' && post_block == 0
return indent(lnum) + &sw
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) + &sw
endif
endif
endif
if cline =~ '^\s*else'
if line =~ '<-\s*if\s*()'
return indent(lnum) + &sw
else
if line =~ '\<if\s*()'
return indent(lnum)
else
return indent(lnum) - &sw
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)
let pind = indent(plnum)
if g:r_indent_align_args == 0 && pb != 0
let ind += pb * &sw
return ind return ind
endif
if g:r_indent_align_args == 0 && bb != 0
let ind += bb * &sw
return ind
endif
if ind == pind || (ind == (pind + &sw) && 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 + &sw) && pline =~ '{$'
return ind
endif
endwhile
return ind
endfunction endfunction
" vim: sw=4 " vim: sw=2

View File

@ -1,7 +1,7 @@
" Vim indent file " Vim indent file
" Language: R Documentation (Help), *.Rd " Language: R Documentation (Help), *.Rd
" Author: Jakson Alves de Aquino <jalvesaq@gmail.com> " Author: Jakson Alves de Aquino <jalvesaq@gmail.com>
" Last Change: Wed Jul 09, 2014 07:34PM " Last Change: Thu Oct 16, 2014 07:07AM
" Only load this indent file when no other was loaded. " Only load this indent file when no other was loaded.
@ -12,22 +12,18 @@ runtime indent/r.vim
let s:RIndent = function(substitute(&indentexpr, "()", "", "")) let s:RIndent = function(substitute(&indentexpr, "()", "", ""))
let b:did_indent = 1 let b:did_indent = 1
setlocal indentkeys=0{,0},:,!^F,o,O,e
setlocal indentexpr=GetRHelpIndent()
" Only define the function once.
if exists("*GetRHelpIndent")
finish
endif
setlocal noautoindent setlocal noautoindent
setlocal nocindent setlocal nocindent
setlocal nosmartindent setlocal nosmartindent
setlocal nolisp setlocal nolisp
setlocal indentkeys=0{,0},:,!^F,o,O,e setlocal indentkeys=0{,0},:,!^F,o,O,e
setlocal indentexpr=GetCorrectRHelpIndent() setlocal indentexpr=GetCorrectRHelpIndent()
" Only define the functions once.
if exists("*GetRHelpIndent")
finish
endif
function s:SanitizeRHelpLine(line) function s:SanitizeRHelpLine(line)
let newline = substitute(a:line, '\\\\', "x", "g") let newline = substitute(a:line, '\\\\', "x", "g")
let newline = substitute(newline, '\\{', "x", "g") let newline = substitute(newline, '\\{', "x", "g")

View File

@ -1,7 +1,7 @@
" Vim indent file " Vim indent file
" Language: Rmd " Language: Rmd
" Author: Jakson Alves de Aquino <jalvesaq@gmail.com> " Author: Jakson Alves de Aquino <jalvesaq@gmail.com>
" Last Change: Wed Jul 09, 2014 07:33PM " Last Change: Thu Jul 10, 2014 07:11PM
" Only load this indent file when no other was loaded. " Only load this indent file when no other was loaded.
@ -33,10 +33,10 @@ function GetMdIndent()
endfunction endfunction
function GetRmdIndent() function GetRmdIndent()
if getline(".") =~ '^```{r .*}$' || getline(".") =~ '^```$' if getline(".") =~ '^[ \t]*```{r .*}$' || getline(".") =~ '^[ \t]*```$'
return 0 return 0
endif endif
if search('^```{r', "bncW") > search('^```$', "bncW") if search('^[ \t]*```{r', "bncW") > search('^[ \t]*```$', "bncW")
return s:RIndent() return s:RIndent()
else else
return GetMdIndent() return GetMdIndent()

View File

@ -1,7 +1,7 @@
" Vim indent file " Vim indent file
" Language: Rnoweb " Language: Rnoweb
" Author: Jakson Alves de Aquino <jalvesaq@gmail.com> " Author: Jakson Alves de Aquino <jalvesaq@gmail.com>
" Last Change: Wed Jul 09, 2014 07:28PM " Last Change: Sun Mar 22, 2015 09:28AM
" Only load this indent file when no other was loaded. " Only load this indent file when no other was loaded.
@ -23,7 +23,8 @@ if exists("*GetRnowebIndent")
endif endif
function GetRnowebIndent() function GetRnowebIndent()
if getline(".") =~ "^<<.*>>=$" let curline = getline(".")
if curline =~ '^<<.*>>=$' || curline =~ '^\s*@$'
return 0 return 0
endif endif
if search("^<<", "bncW") > search("^@", "bncW") if search("^<<", "bncW") > search("^@", "bncW")

View File

@ -3,12 +3,11 @@
" Maintainer: Jakson Aquino <jalvesaq@gmail.com> " Maintainer: Jakson Aquino <jalvesaq@gmail.com>
" Former Maintainers: Vaidotas Zemlys <zemlys@gmail.com> " Former Maintainers: Vaidotas Zemlys <zemlys@gmail.com>
" Tom Payne <tom@tompayne.org> " Tom Payne <tom@tompayne.org>
" Last Change: Wed Jul 09, 2014 10:29PM " Last Change: Wed Dec 31, 2014 12:36AM
" Filenames: *.R *.r *.Rhistory *.Rt " Filenames: *.R *.r *.Rhistory *.Rt
" "
" NOTE: The highlighting of R functions is defined in the " NOTE: The highlighting of R functions is defined in
" r-plugin/functions.vim, which is part of vim-r-plugin2: " runtime files created by a filetype plugin, if installed.
" http://www.vim.org/scripts/script.php?script_id=2628
" "
" CONFIGURATION: " CONFIGURATION:
" syntax folding can be turned on by " syntax folding can be turned on by
@ -37,9 +36,9 @@ syn match rComment contains=@Spell,rCommentTodo "#.*"
syn match rOKeyword contained "@\(param\|return\|name\|rdname\|examples\|include\|docType\)" syn match rOKeyword contained "@\(param\|return\|name\|rdname\|examples\|include\|docType\)"
syn match rOKeyword contained "@\(S3method\|TODO\|aliases\|alias\|assignee\|author\|callGraphDepth\|callGraph\)" syn match rOKeyword contained "@\(S3method\|TODO\|aliases\|alias\|assignee\|author\|callGraphDepth\|callGraph\)"
syn match rOKeyword contained "@\(callGraphPrimitives\|concept\|exportClass\|exportMethod\|exportPattern\|export\|formals\)" syn match rOKeyword contained "@\(callGraphPrimitives\|concept\|exportClass\|exportMethod\|exportPattern\|export\|formals\)"
syn match rOKeyword contained "@\(format\|importClassesFrom\|importFrom\|importMethodsFrom\|import\|keywords\)" syn match rOKeyword contained "@\(format\|importClassesFrom\|importFrom\|importMethodsFrom\|import\|keywords\|useDynLib\)"
syn match rOKeyword contained "@\(method\|noRd\|note\|references\|seealso\|setClass\|slot\|source\|title\|usage\)" syn match rOKeyword contained "@\(method\|noRd\|note\|references\|seealso\|setClass\|slot\|source\|title\|usage\)"
syn match rOKeyword contained "@\(family\|template\|templateVar\|description\|details\|inheritsParams\)" syn match rOKeyword contained "@\(family\|template\|templateVar\|description\|details\|inheritParams\)"
syn match rOComment contains=@Spell,rOKeyword "#'.*" syn match rOComment contains=@Spell,rOKeyword "#'.*"
@ -79,12 +78,12 @@ syn keyword rRepeat for in repeat while
syn keyword rConstant T F LETTERS letters month.abb month.name pi syn keyword rConstant T F LETTERS letters month.abb month.name pi
syn keyword rConstant R.version.string syn keyword rConstant R.version.string
syn keyword rNumber NA_integer_ NA_real_ NA_complex_ NA_character_ syn keyword rNumber NA_integer_ NA_real_ NA_complex_ NA_character_
" Constants " Constants
syn keyword rConstant NULL syn keyword rConstant NULL
syn keyword rBoolean FALSE TRUE syn keyword rBoolean FALSE TRUE
syn keyword rNumber NA Inf NaN syn keyword rNumber NA Inf NaN
" integer " integer
syn match rInteger "\<\d\+L" syn match rInteger "\<\d\+L"
@ -93,7 +92,7 @@ syn match rInteger "\<\d\+[Ee]+\=\d\+L"
" number with no fractional part or exponent " number with no fractional part or exponent
syn match rNumber "\<\d\+\>" syn match rNumber "\<\d\+\>"
" hexadecimal number " hexadecimal number
syn match rNumber "\<0x\([0-9]\|[a-f]\|[A-F]\)\+" syn match rNumber "\<0x\([0-9]\|[a-f]\|[A-F]\)\+"
" floating point number with integer and fractional parts and optional exponent " floating point number with integer and fractional parts and optional exponent
@ -111,17 +110,19 @@ syn match rComplex "\<\d\+\.\d*\([Ee][-+]\=\d\+\)\=i"
syn match rComplex "\<\.\d\+\([Ee][-+]\=\d\+\)\=i" syn match rComplex "\<\.\d\+\([Ee][-+]\=\d\+\)\=i"
syn match rComplex "\<\d\+[Ee][-+]\=\d\+i" syn match rComplex "\<\d\+[Ee][-+]\=\d\+i"
syn match rAssign '='
syn match rOperator "&" syn match rOperator "&"
syn match rOperator '-' syn match rOperator '-'
syn match rOperator '\*' syn match rOperator '\*'
syn match rOperator '+' syn match rOperator '+'
syn match rOperator '='
if &filetype != "rmd" && &filetype != "rrst" if &filetype != "rmd" && &filetype != "rrst"
syn match rOperator "[|!<>^~/:]" syn match rOperator "[|!<>^~/:]"
else else
syn match rOperator "[|!<>^~`/:]" syn match rOperator "[|!<>^~`/:]"
endif endif
syn match rOperator "%\{2}\|%\S\{-}%" syn match rOperator "%\{2}\|%\S\{-}%"
syn match rOperator '\([!><]\)\@<=='
syn match rOperator '=='
syn match rOpError '\*\{3}' syn match rOpError '\*\{3}'
syn match rOpError '//' syn match rOpError '//'
syn match rOpError '&&&' syn match rOpError '&&&'
@ -129,8 +130,8 @@ syn match rOpError '|||'
syn match rOpError '<<' syn match rOpError '<<'
syn match rOpError '>>' syn match rOpError '>>'
syn match rArrow "<\{1,2}-" syn match rAssign "<\{1,2}-"
syn match rArrow "->\{1,2}" syn match rAssign "->\{1,2}"
" Special " Special
syn match rDelimiter "[,;:]" syn match rDelimiter "[,;:]"
@ -151,9 +152,14 @@ syn match rBraceError "[)}]" contained
syn match rCurlyError "[)\]]" contained syn match rCurlyError "[)\]]" contained
syn match rParenError "[\]}]" contained syn match rParenError "[\]}]" contained
" Source list of R functions. The list is produced by the Vim-R-plugin " Source list of R functions produced by a filetype plugin (if installed)
" http://www.vim.org/scripts/script.php?script_id=2628 if has("nvim")
runtime r-plugin/functions.vim " Nvim-R
runtime R/functions.vim
else
" Vim-R-plugin
runtime r-plugin/functions.vim
endif
syn match rDollar display contained "\$" syn match rDollar display contained "\$"
syn match rDollar display contained "@" syn match rDollar display contained "@"
@ -171,7 +177,7 @@ if &filetype == "rhelp"
endif endif
" Type " Type
syn keyword rType array category character complex double function integer list logical matrix numeric vector data.frame syn keyword rType array category character complex double function integer list logical matrix numeric vector data.frame
" Name of object with spaces " Name of object with spaces
if &filetype != "rmd" && &filetype != "rrst" if &filetype != "rmd" && &filetype != "rrst"
@ -179,13 +185,19 @@ if &filetype != "rmd" && &filetype != "rrst"
endif endif
if &filetype == "rhelp" if &filetype == "rhelp"
syn match rhPreProc "^#ifdef.*" syn match rhPreProc "^#ifdef.*"
syn match rhPreProc "^#endif.*" syn match rhPreProc "^#endif.*"
syn match rhSection "\\dontrun\>" syn match rhSection "\\dontrun\>"
endif endif
if exists("r_syn_minlines")
exe "syn sync minlines=" . r_syn_minlines
else
syn sync minlines=40
endif
" Define the default highlighting. " Define the default highlighting.
hi def link rArrow Statement hi def link rAssign Statement
hi def link rBoolean Boolean hi def link rBoolean Boolean
hi def link rBraceError Error hi def link rBraceError Error
hi def link rComment Comment hi def link rComment Comment
@ -204,7 +216,7 @@ hi def link rHelpIdent Identifier
hi def link rhPreProc PreProc hi def link rhPreProc PreProc
hi def link rhSection PreCondit hi def link rhSection PreCondit
hi def link rInteger Number hi def link rInteger Number
hi def link rLstElmt Normal hi def link rLstElmt Normal
hi def link rNameWSpace Normal hi def link rNameWSpace Normal
hi def link rNumber Number hi def link rNumber Number
hi def link rOperator Operator hi def link rOperator Operator