R 的丰富 Ctags

发布于 2024-10-14 15:16:39 字数 457 浏览 10 评论 0 原文

是否有任何关于 ctags 与 R 的使用记录? 这有用吗? 实施起来会不会很困难?

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

更新:我后来偶然发现了rtags 功能。 下面建议它可以与 vim 配合使用。

Is there any documented use of ctags with R?
Would this be useful?
Would it be difficult to implement?

Specifically, I've just started using Vim.
It would be cool to be able to write an R function in one file, use the function in another file (e.g., an Rnw file, test file, or some other script), and be able to use Ctrl+] to navigate to the function source.

Update: I've since stumbled on the rtags function. It is suggested below that it works with vim.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(7

友欢 2024-10-21 15:16:39

这是对 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/

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

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

This is a modification of Henrico's answer, and may be implemented by copying and pasting the following code into one's ~/.ctags files. Henrico's code did not work for indented functions, but the following code does.

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

This allows variables to be recognized with ctags as well as functions. If you're using the taglist vim addon, then, it allows you to distinguish between global variables and other variables. Also, if you're using taglist, then you will need to paste the following in your vimrc.

let tlist_r_settings = 'R;f:Functions;g:GlobalVariables;v:FunctionVariables'
橙味迷妹 2024-10-21 15:16:39

这是我的主目录中 .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/

This is the content of my .ctags file in my home directory. I found it somewhere on the internet. Using this you can generate a tags-file for 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/
递刀给你 2024-10-21 15:16:39

到目前为止,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)

rtags() is the best to way to generate tags for R codes from what I see so far, since it will take all different ways of assignments in consideration, such as:

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

An example of using 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)
雨后咖啡店 2024-10-21 15:16:39

正如其他 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 时,vim 将运行外部进程 Rscript (它必须位于当然是 PATH )并评估 rtags(path="./", recursive=TRUE, ofile="RTAGS");etags2ctags("RTAGS", "rtags");unlink( “RTAGS”)rtags() 将在 RTAGS 文件>Emacs 标签格式 然后 etags2ctags() 会将其转换为 vim 可以读取的 rtags 文件。 unlink() 删除 RTAGS 文件,因为 vim 不需要它。

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

As mentioned by other rtags() + etags2ctags() can generate a tagsfile for vim (see :h tags-and-searches). You can create a custom command for vim so that it run rtags() in R using Rscript. To do so put this in your .vimrc:

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

Now when you do :Rtags vim will run the external process Rscript (it has to be in the PATH of course) and evaluate rtags(path="./", recursive=TRUE, ofile="RTAGS");etags2ctags("RTAGS", "rtags");unlink("RTAGS"). rtags() will generate an RTAGS file in Emacs tags format then etags2ctags() will transform that into an rtags file which vim can read. unlink() deletes the RTAGS file since it's not needed for vim.

The set tags+=rtags makes vim to search for an rtags file in addition to the usual tags file (See :h tags-and-searches)

拥抱我好吗 2024-10-21 15:16:39

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。

Universal-ctags has an R parser.

$ 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

In addition, the ctags implementation supports R6Class and S4Class.

帝王念 2024-10-21 15:16:39

实际上,我认为 rtags() 在 vi​​m 中可以工作。

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

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

通过此设置,使用 :Rtags在 vim 中重建标签,然后例如当鼠标悬停在单词上时 g] 找到该单词的定义。

Actually, I think rtags() works in vim.

I use the nvim-r plugin (available at https://www.vim.org/scripts/script.php?script_id=2628), and have the following in my ~/.vimrc file:

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

With this setup, using :Rtags in vim rebuilds the tags, and then e.g. g] when the mouse is over a word finds the definitions for that word.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文