生成R文档模板的vim插件

这是一个小的vim脚本,用来在R代码中生成rdoxygen2认识的文档。这里主要是函数文档。用法是,将光标停留在函数定义行,按F3就会在当前函数前面插入这个函数的说明的模板。主要包括了参数的提取过程,省去了手工敲入的过程。

下面是vim代码,把这段代码贴到 ~/.vimrc中就可以了。
支持多行函数的参数提取。
不支持:参数中含有嵌套参数,插件以“,”来分割个参数,形如f(aa=list(name=”hello”,value=”vv”))这样的list参数,这种情况只会提取出参数aa , value , 并不是想要的情况,但是这种参数不多。多出的参数手工删除工作量也不大。因此没有进行进一步的改进。

github 页面: https://github.com/jiang-hang/vim4roxygen2

    function Getparams()
        let s:start = line('.')
        let s:end = search("{")
        if stridx(getline(s:end),"{") == 0
            let s:end = s:end - 1
        endif
        let s:lines=getline(s:start,s:end)
        let linesCnt=len(s:lines)
        let mlines=join(s:lines)
        let mlines=substitute(mlines," ","","g")
        let paraFlag1=stridx(mlines,'(')
        let paraFlag2=strridx(mlines,')')
        let paraLen=paraFlag2-paraFlag1-1
        let parastr=strpart(mlines,paraFlag1+1,paraLen)
        let alist=[]
        if  stridx(parastr,',') != -1
           let s:paras=split(parastr,',')
           let s:idx=0
           while s:idx < len(s:paras)
                 if stridx(s:paras[s:idx],'=') != -1
                      let s:realpara = split(s:paras[s:idx],'=')[0]
                 else
                      let s:realpara = s:paras[s:idx]
                 endif
                 "strip the leading blanks
                 "call append(s:start - 1 + s:idx , "#' @param " . s:realpara)
                 call add(alist,s:realpara)
                 let s:idx = s:idx + 1
           endwhile
        else
           "call append(s:start-1,parastr) 
           if parastr != ""
              call add(alist,parastr)
           endif
        endif
        return alist
    endfunction

    function  Rdoc()
        let s:wd=expand("")
        let s:lineNo=line('.')-1
        let plist=Getparams()
        call append(s:lineNo,"#' title ")
        call append(s:lineNo + 1,"#' ")
        call append(s:lineNo + 2,"#' description")
        call append(s:lineNo + 3,"#' ")
        let s:idx =0
        while s:idx < len(plist)
            call append(s:lineNo + 4 + s:idx , "#' @param " . plist[s:idx] . " value")
            let s:idx = s:idx + 1
        endwhile
        call append(s:lineNo + 4 + s:idx,"#' @return returndes")
        call append(s:lineNo + 4 + s:idx + 1,"#' @export ")
        call append(s:lineNo + 4 + s:idx + 2,"#' @examples ")
        call append(s:lineNo + 4 + s:idx + 3,"#' x=c(1,2,3) ")
    endfunction


    nmap <F3> :call Rdoc() <CR>

下面是一个函数代码生成实例,函数定义上面的文档是插件生成的。如果函数不需要导出,需要删除@export行
#’ title
#’
#’ description
#’
#’ @param a value
#’ @param b value
#’ @param d value
#’ @param e value
#’ @return returndes
#’ @export
#’ @examples
#’ x=c(1,2,3)
afunction<-function(a,b=“cc”,d=1,e){ return 1 }



本文地址: http://www.bagualu.net/wordpress/archives/4997 转载请注明




发表评论

电子邮件地址不会被公开。 必填项已用*标注