2011-01-25 61 views
19

ctags与R有任何记录的使用? 这会很有用吗? 难以实施吗?Exuberant Ctags with R

具体来说,我刚开始使用Vim。 能够在一个文件中编写R函数,在另一个文件(例如,Rnw文件,测试文件或其他脚本)中使用该函数并且能够使用Ctrl +]导航到功能源。

更新:我自从偶然发现了rtags函数,虽然它暗示它是emacs特有的。

回答

3

可能你可以阅读how to add support for a new language ctags。

+0

谢谢。我快速浏览了一下。我从来没有使用ctags,所以它可能有点学习曲线。但我打算进一步深入。 – 2011-01-25 14:55:02

9

这是我的主目录中的.ctags文件的内容。我发现它在互联网上的某个地方。使用这个你可以为vim生成一个tags-file。

--langdef=Splus 
--langmap=Splus:.s.S.R.r.q 
--regex-Splus=/^[ \t]+"?([.A-Za-z][.A-Za-z0-9_]*)"?[\t]*<-[\t]*function/\1/ 
--regex-Splus=/^"?([.A-Za-z][.A-Za-z0-9_]*)"?[ \t]*<-/\1/ 
+0

我希望它是`--langdef = R`而不是... – shabbychef 2012-05-17 17:10:40

+0

@shabbychef因为函数等的语言定义是相同的,所以不需要使用单独的Ctags定义。当然,你可以把`--langdef = Splus`改成`--langdef = R`。 – 2012-10-29 10:47:33

+0

你的编辑不太合适,@LMZ - 他们改变了Henrico的答案,以至于不再是他的答案。如果您有更好的解决方案,请将其作为您自己的答案发布。 – 2013-01-26 22:07:34

11

这是对Henrico答案的修改,可以通过将以下代码复制并粘贴到〜/ .ctags文件中来实现。 Henrico的代码不适用于缩进函数,但下面的代码可以。

--langdef=R 
--langmap=r:.R.r 
--regex-R=/^[ \t]*"?([.A-Za-z][.A-Za-z0-9_]*)"?[ \t]*<-[ \t]function/\1/f,Functions/ 
--regex-R=/^"?([.A-Za-z][.A-Za-z0-9_]*)"?[ \t]*<-[ \t][^f][^u][^n][^c][^t][^i][^o][^n]/\1/g,GlobalVars/ 
--regex-R=/[ \t]"?([.A-Za-z][.A-Za-z0-9_]*)"?[ \t]*<-[ \t][^f][^u][^n][^c][^t][^i][^o][^n]/\1/v,FunctionVariables/ 

这允许用ctags和函数来识别变量。如果你使用taglist vim addon,那么它可以让你区分全局变量和其他变量。另外,如果您使用的是标签列表,那么您需要将以下内容粘贴到您的vimrc中。

let tlist_r_settings = 'R;f:Functions;g:GlobalVariables;v:FunctionVariables' 
2

rtags()是最好的方法,从我所看到的,到目前为止,因为它会分配在考虑各种不同的方式,比如生成的R代码标签:

ok = c("<-", "=", "<<-", "assign", 
     "setGeneric", "setGroupGeneric", "setMethod", 
     "setClass", "setClassUnion") 

使用rtags()的一个例子:如所提到的由其它rtags() + etags2ctags()

path <- "~/path/to/project" 
rtags(path=path, 
     pattern = "[.]*\\.[RrSs]$", 
     keep.re = ".", # the value ('/R/') in the help page will only run through the codes in R/ folder. 
     verbose = TRUE, 
     ofile = file.path(path, 'TAGS'), 
     append = FALSE, 
     recursive = TRUE) 
1

可以生成一个VIM tagsfile(参见:h tags-and-searches)。您可以为vim创建自定义命令,以便使用Rscript在R中运行rtags()。当你做:Rtags VIM将运行外部进程Rscript(它必须是当然的PATH)和评估rtags(path="./", recursive=TRUE, ofile="RTAGS");etags2ctags("RTAGS", "rtags");unlink("RTAGS")

:command! Rtags :!Rscript -e 'rtags(path="./", recursive=TRUE, ofile="RTAGS")' -e 'etags2ctags("RTAGS", "rtags")' -e 'unlink("RTAGS")' 
set tags+=rtags 

现在:这样做,把这个在您的.vimrcrtags()将在Emacs tags format中生成RTAGS文件,那么etags2ctags()会将其转换为vim可以读取的rtags文件。 unlink()删除RTAGS文件,因为它不需要vim。

set tags+=rtags使得VIM为一个rtags文件除了搜索通常的tags文件(见:h tags-and-searches