Буйные Ctags с R

Есть ли задокументированное использование ctags с R? Будет ли это полезно? Сложно будет реализовать?

В частности, я только начал использовать Vim. Было бы здорово иметь возможность написать функцию R в одном файле, использовать функцию в другом файле (например, файле Rnw, тестовом файле или каком-то другом скрипте) и иметь возможность использовать Ctrl+] для перехода к функции. источник.

Обновление: я наткнулся на ссылку rtags. Предлагается ниже, что он работает с vim.


person Jeromy Anglim    schedule 25.01.2011    source источник


Ответы (7)


Это модификация ответа Хенрико, и ее можно реализовать, скопировав и вставив следующий код в свои файлы ~/.ctags. Код Хенрико не работает для функций с отступом, но следующий код работает.

--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'
person LMZ    schedule 26.01.2013
comment
Я думаю, что этот ответ неверен! Проверьте stackoverflow.com/questions/32206608/ctags-and-r-regex. - person Vitor; 26.08.2015

Это содержимое моего файла .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/
person Henrico    schedule 25.01.2011
comment
@shabbychef Поскольку определение языка для функций и тому подобного одинаково, нет необходимости использовать отдельное определение Ctags. Конечно, вы можете просто изменить --langdef=Splus на --langdef=R. - person Paul Hiemstra; 29.10.2012
comment
Ваши правки не совсем уместны, @LMZ - они так сильно меняют ответ Хенрико, что это больше не его ответ. Если у вас есть лучшее решение, опубликуйте его как собственный ответ. - person Michael Petrotta; 27.01.2013

Вероятно, вы можете прочитать как добавить поддержку нового языка в ctags.

person Benoit    schedule 25.01.2011
comment
Спасибо. Я быстро посмотрел на это. Я никогда не использовал ctags, так что это может быть что-то вроде кривой обучения. Но я планирую углубиться в это больше. - person Jeromy Anglim; 25.01.2011

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)
person SHUAICHENG WANG    schedule 19.03.2016
comment
Это полезно, как вывод rtags можно интегрировать с vim? - person Konrad; 21.12.2016

Как упоминалось другими, rtags() + etags2ctags() может генерировать tagsfile для vim (см. :h tags-and-searches). Вы можете создать пользовательскую команду для vim, чтобы она запускала rtags() в R, используя Rscript. Для этого поместите это в свой .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() создаст файл RTAGS в формате тегов Emacs, затем etags2ctags() преобразует его в rtags файл, который vim может прочитать. unlink() удаляет файл RTAGS, так как он не нужен для vim.

set tags+=rtags заставляет vim искать файл rtags в дополнение к обычному файлу tags (см. :h tags-and-searches)

person RubenLaguna    schedule 08.12.2016

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.

person Masatake YAMATO    schedule 30.10.2020

На самом деле, я думаю, что 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")'

С этой настройкой использование :Rtags в vim перестраивает теги, а затем, например. g] когда мышь находится над словом, находит определения для этого слова.

person dank    schedule 02.06.2021