Обильные Ctags с R - PullRequest
       31

Обильные Ctags с R

20 голосов
/ 25 января 2011

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

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

Обновление: С тех пор я наткнулся на функцию rtags , хотя предполагается, что она специфична для emacs.

Ответы [ 5 ]

11 голосов
/ 27 января 2013

Это модификация ответа 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'
9 голосов
/ 25 января 2011

Это содержимое моего файла .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 голосов
/ 25 января 2011

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

2 голосов
/ 20 марта 2016

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 голос
/ 08 декабря 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)

...