2011-01-25 1 views
19

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

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

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

ответ

3

Возможно, вы можете прочитать how to add support for a new language в ctags.

+0

Спасибо. Я быстро посмотрел на это. Я никогда не использовал ctags, поэтому это может быть немного кривая обучения. Но я планирую заняться этим больше. –

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

Мне жаль, что это не было ... --langdef = R' вместо ... – shabbychef

+0

@shabbychef Поскольку определение языка для таких функций равно и равно, нет необходимости использовать отдельное определение Ctags. Конечно, вы можете просто изменить '--langdef = Splus' на' --langdef = R'. –

+0

Ваши правки не очень подходят, @LMZ - они меняют так много ответа Хенрико, что это уже не его ответ. Если у вас есть лучшее решение, отправьте его в ответ на свой вопрос. –

11

Это модификация ответ Энрико, и могут быть реализованы путем копирования и вставив следующий код в своих ~/.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' 
+1

Те, кто использует плагин TagBar vim, видят: https://github.com/majutsushi/tagbar/wiki#r – gkcn

+1

Я думаю, что этот ответ неверен! Проверьте http://stackoverflow.com/questions/32206608/ctags-and-r-regex – Vitor

2

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) 
+1

Это полезно, как вывод 'rtags' можно интегрировать с [tag: vim]? – Konrad

1

Как уже упоминалось другими 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 tags format, тогда etags2ctags() преобразует это в файл rtags, который vim может прочитать. unlink() удаляет файл RTAGS, так как он не нужен для vim.

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