ctags与R有任何记录的使用? 这会很有用吗? 难以实施吗?Exuberant Ctags with R
具体来说,我刚开始使用Vim。 能够在一个文件中编写R函数,在另一个文件(例如,Rnw文件,测试文件或其他脚本)中使用该函数并且能够使用Ctrl +]导航到功能源。
更新:我自从偶然发现了rtags函数,虽然它暗示它是emacs特有的。
ctags与R有任何记录的使用? 这会很有用吗? 难以实施吗?Exuberant Ctags with R
具体来说,我刚开始使用Vim。 能够在一个文件中编写R函数,在另一个文件(例如,Rnw文件,测试文件或其他脚本)中使用该函数并且能够使用Ctrl +]导航到功能源。
更新:我自从偶然发现了rtags函数,虽然它暗示它是emacs特有的。
可能你可以阅读how to add support for a new language ctags。
这是我的主目录中的.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/
我希望它是`--langdef = R`而不是... – shabbychef 2012-05-17 17:10:40
@shabbychef因为函数等的语言定义是相同的,所以不需要使用单独的Ctags定义。当然,你可以把`--langdef = Splus`改成`--langdef = R`。 – 2012-10-29 10:47:33
你的编辑不太合适,@LMZ - 他们改变了Henrico的答案,以至于不再是他的答案。如果您有更好的解决方案,请将其作为您自己的答案发布。 – 2013-01-26 22:07:34
这是对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'
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)
可以生成一个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
现在:这样做,把这个在您的.vimrc
。 rtags()
将在Emacs tags format中生成RTAGS
文件,那么etags2ctags()
会将其转换为vim可以读取的rtags
文件。 unlink()
删除RTAGS
文件,因为它不需要vim。
的set tags+=rtags
使得VIM为一个rtags
文件除了搜索通常的tags
文件(见:h tags-and-searches
)
谢谢。我快速浏览了一下。我从来没有使用ctags,所以它可能有点学习曲线。但我打算进一步深入。 – 2011-01-25 14:55:02