Подтвердить что ты не робот

Буйные бугры с R

Существует ли какое-либо документированное использование ctags с помощью R? Было бы полезно? Было бы трудно реализовать?

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

Обновление: Я с тех пор наткнулся на rtags, хотя это говорит о том, что это emacs специфичны.

4b9b3361

Ответ 1

Это модификация ответа 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, то он позволяет различать глобальные переменные и другие переменные. Кроме того, если вы используете taglist, вам нужно вставить следующее в свой vimrc.

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

Ответ 2

Это содержимое моего .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/

Ответ 4

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)

Ответ 5

Как упоминалось другим rtags() + etags2ctags(), можно генерировать a 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)