2011-01-25 9 views
19

¿Hay algún uso documentado de ctags con R? ¿Sería esto útil? ¿Sería difícil de implementar?Ctags exuberantes con R

Específicamente, acabo de empezar a usar Vim. Sería genial poder escribir una función R en un archivo, usar la función en otro archivo (por ejemplo, un archivo Rnw, archivo de prueba u otro script), y poder usar Ctrl +] para navegar al fuente de función.

Actualización: Desde entonces tropecé con la función rtags, aunque sugiere que es específica de emacs.

Respuesta

3

Probablemente usted puede leer how to add support for a new language en los ctags.

+0

Gracias. Eché un vistazo rápido a eso. Nunca he usado ctags, por lo que podría ser una curva de aprendizaje. Pero planeo entrar en eso más. –

9

Este es el contenido de mi archivo .ctags en mi directorio personal. Lo encontré en algún lado en internet. Usando esto puedes generar un archivo de etiquetas para 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

Ojalá fuera '--langdef = R' en su lugar ... – shabbychef

+0

@shabbychef Debido a que la definición del lenguaje para funciones y similares es igual, no hay necesidad de usar una definición de Ctags por separado. Por supuesto, puedes simplemente cambiar '--langdef = Splus' a' --langdef = R'. –

+0

Sus ediciones no son realmente apropiadas, @LMZ: cambian tanto la respuesta de Henrico que ya no es su respuesta. Si tiene una mejor solución, publíquela como una respuesta propia. –

11

Ésta es una modificación de la respuesta de Henrico, y podrán aplicarse mediante copiar y pegar el siguiente código en uno de ~/.ctags archivos. El código de Henrico no funcionaba para las funciones sangradas, pero el siguiente código sí.

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

Esto permite que las variables sean reconocidas tanto con ctags como con funciones. Si está usando el complemento taglist vim, entonces, le permite distinguir entre variables globales y otras variables. Además, si usa taglist, deberá pegar lo siguiente en su vimrc.

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

Aquellos que usan el complemento TagBar vim ver: https://github.com/majutsushi/tagbar/wiki#r – gkcn

+1

¡Creo que esta respuesta es incorrecta! Compruebe http://stackoverflow.com/questions/32206608/ctags-and-r-regex – Vitor

2

rtags() es la mejor manera de manera de generar etiquetas de códigos de I por lo que veo hasta ahora, ya que tomará todas las maneras diferentes de asignaciones en consideración, por ejemplo:

ok = c("<-", "=", "<<-", "assign", 
     "setGeneric", "setGroupGeneric", "setMethod", 
     "setClass", "setClassUnion") 

un ejemplo del uso 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

Esto es útil, ¿cómo la salida 'rtags' se puede integrar con [tag: vim]? – Konrad

1

Como se ha mencionado por otro rtags() + etags2ctags() puede generar un tagsfile para vim (ver :h tags-and-searches). Puede crear un comando personalizado para vim para que se ejecute rtags() en R usando Rscript. Para hacerlo ponga esto en su .vimrc:

:command! Rtags :!Rscript -e 'rtags(path="./", recursive=TRUE, ofile="RTAGS")' -e 'etags2ctags("RTAGS", "rtags")' -e 'unlink("RTAGS")' 
set tags+=rtags 

Ahora cuando haces :Rtags vim se ejecutará el proceso externo Rscript (tiene que estar en el PATH por supuesto) y evaluar rtags(path="./", recursive=TRUE, ofile="RTAGS");etags2ctags("RTAGS", "rtags");unlink("RTAGS"). rtags() generará un archivo RTAGS en Emacs tags format luego etags2ctags() lo transformará en un archivo rtags que vim puede leer. unlink() borra el archivo RTAGS ya que no es necesario para vim.

El set tags+=rtags hace que vim para buscar un archivo rtags además del archivo de costumbre tags (Ver :h tags-and-searches)

Cuestiones relacionadas