Exuberant Ctags与R

20

有没有记录使用ctags与R语言的情况?

这对我是否有用?

实现起来难度大吗?

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

更新:我后来偶然发现了rtags函数。据下面的建议,它可以与Vim一起使用。

7个回答

10

这是根据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插件,则可以区分全局变量和其他变量。此外,如果您正在使用taglist,则需要将以下内容粘贴到vimrc中。

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

2
我认为这个答案是错误的!请查看http://stackoverflow.com/questions/32206608/ctags-and-r-regex - Vitor

9

这是我在家目录中的.ctags文件内容。我在互联网上找到了它。使用它,您可以为vim生成一个标签文件。

 --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/

@shabbychef 因为函数和其他语言定义是相同的,所以不需要使用单独的Ctags定义。当然,你可以将 --langdef=Splus 更改为 --langdef=R - Paul Hiemstra
你的编辑并不是很合适,@LMZ - 它们改变了Henrico答案的很多内容,以至于它不再是他的答案了。如果你有更好的解决方案,请将其作为你自己的答案发布。 - Michael Petrotta

3

就我目前所见,rtags()是生成R代码标签的最佳方式,因为它将考虑所有不同的赋值方式,例如:

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

使用rtags()的示例:
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)

2
这很有用,如何将rtags输出与[tag:vim]集成? - Konrad

3

谢谢。我快速浏览了一下。我从未使用过ctags,所以可能需要一些学习曲线。但我计划更深入地了解它。 - Jeromy Anglim

1

实际上,我认为 rtags() 在 vim 中可以使用。

我使用 nvim-r 插件(可在 https://www.vim.org/scripts/script.php?script_id=2628 获取),并在我的 ~/.vimrc 文件中添加了以下内容:

:command! Rtags :!Rscript -e 'rtags(path="./", recursive=TRUE, ofile="TAGS")'

使用这个设置,在vim中使用:Rtags来重建标签,然后当鼠标悬停在一个单词上时,使用g]可以找到该单词的定义。

1

如其他人所提到的,rtags()+etags2ctags()可以为vim生成一个tagsfile(请参见:h tags-and-searches)。您可以为vim创建一个自定义命令,以便使用Rscript在R中运行rtags()。要这样做,请将以下内容放入您的.vimrc文件中:

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

现在当你执行:Rtags时,vim将运行外部进程Rscript(它必须在PATH中),并评估rtags(path="./", recursive=TRUE, ofile="RTAGS");etags2ctags("RTAGS", "rtags");unlink("RTAGS")rtags()会生成一个Emacs tags format格式的RTAGS文件,然后etags2ctags()将其转换为vim可以读取的rtags文件。unlink()删除了不需要的RTAGS文件。

set tags+=rtags使vim除了通常的tags文件外还会搜索rtags文件(参见:h tags-and-searches


1
"

Universal-ctags 有一个 R 解析器。

"
$ cat input.r
add <- function (x, y) {
    3 -> z
    return(x + y + z)
}
add (3, 4)
$ ./ctags --quiet --options=NONE -o - --kinds-R='*' --fields=+S input.r
add input.r /^add <- function (x, y) {$/;"  f   signature:(x, y)
x   input.r /^add <- function (x, y) {$/;"  z   function:add
y   input.r /^add <- function (x, y) {$/;"  z   function:add
z   input.r /^    3 -> z$/;"    v   function:add

此外,ctags实现支持R6Class和S4Class。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接