> But it still doesn't indent R files correctly. See an indented result > below. Can somebody fix the bug in the indentation file for R and add > it in future version of vim?
There is also: http://www.vim.org/scripts/script.php?script_id=2628 And some other files. I personally use this version: setlocal indentexpr=GetRIndent() if exists("*GetRIndent") finish endif let s:r_keywords_plus='\<\(if\|while\|for\)\>' let s:r_keywords_minus='\<\(else\)\>' fun! GetRIndent() " Find a non-blank line above the current line. let lnum = prevnonblank(v:lnum - 1) " At the start of the file use zero indent. if lnum == 0 return 0 endif let ind = indent(lnum) let line = getline(lnum) " last line let cnum = v:lnum let cind = indent(cnum) let cline = getline(cnum) if cline =~ '^\s*#' return ind endif let lplus = (line =~ s:r_keywords_plus) if cline =~ s:r_keywords_minus if lplus return ind else return ind - &sw endif endif let cnt = <SID>Count(line, '[[{(]', '[])}]') let lrest = s:rest if cnt > 0 return ind + &sw endif let cnt = <SID>Count(cline, '[[{(]', '[])}]') let crest = s:rest if cnt < 0 return ind - &sw endif if lplus && lrest == '' return ind + &sw endif " Match things like: " if (ok) " do(something) " But don't match: " if (ok) do(something) let prev = prevnonblank(lnum - 1) if prev > 0 let pline = getline(prev) let pplus = (pline =~ s:r_keywords_plus) if pplus let pcnt = <SID>Count(pline, '[[{(]', '[])}]') if pcnt == 0 && s:rest == '' return ind - &sw endif endif endif return ind endf fun! <SID>Count(str, rx_open, rx_close) let s:cnt = 0 let s:pcnt = 0 let str = substitute(a:str, '^.\{-}\ze'. a:rx_open, '', '') let str = substitute(str, a:rx_open, "\\=<SID>Count1(submatch (0))", 'g') let co = s:cnt let p = s:pcnt let s:cnt = 0 let s:pcnt = 0 let str = substitute(str, a:rx_close, "\\=<SID>Count1(submatch(0), ". p .")", 'g') let sep = stridx(str, " ") if sep >= 0 let s:rest = strpart(str, sep + 1) endif if s:rest !~ '\S' let s:rest = '' endif let cc = s:cnt return co - cc endf fun! <SID>Count1(match, ...) let s:cnt = s:cnt + 1 if a:match =~ '[()]' let s:pcnt = s:pcnt + 1 if a:0 >= 1 && s:pcnt == a:1 return a:match ."\n" endif endif return a:match endf --~--~---------~--~----~------------~-------~--~----~ You received this message from the "vim_use" maillist. For more information, visit http://www.vim.org/maillist.php -~----------~----~----~----~------~----~------~--~---
