Буйные бугры с R
Существует ли какое-либо документированное использование ctags с помощью R?
Было бы полезно?
Было бы трудно реализовать?
В частности, я только начал использовать Vim.
Было бы здорово написать функцию R в одном файле, использовать функцию в другом файле (например, файл Rnw, тестовый файл или какой-либо другой script) и использовать Ctrl +] для перехода к источник функции.
Обновление: Я с тех пор наткнулся на rtags, хотя это говорит о том, что это emacs специфичны.
Ответы
Ответ 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/
Ответ 3
Возможно, вы можете читать как добавить поддержку нового языка в ctags.
Ответ 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
)