Ctags exuberantes con R
vim exuberant-ctags (5)
¿Hay algún uso documentado de ctags con R? ¿Sería esto útil? ¿Sería difícil de implementar?
Específicamente, acabo de empezar a usar Vim. Sería genial poder escribir una función R en un archivo, usarla en otro (por ejemplo, un archivo Rnw, un archivo de prueba o algún otro script), y poder usar Ctrl +] para navegar a la función fuente.
Actualización: desde entonces me he topado con la función rtags , aunque sugiere que es emacs específica.
Como lo mencionaron otros rtags()
+ etags2ctags()
puede generar un tagsfile
de tagsfile
para vim (ver :h tags-and-searches
). Puede crear un comando personalizado para vim para que ejecute rtags()
en R usando Rscript
. Para ello pon esto en tu .vimrc
:
:command! Rtags :!Rscript -e ''rtags(path="./", recursive=TRUE, ofile="RTAGS")'' -e ''etags2ctags("RTAGS", "rtags")'' -e ''unlink("RTAGS")''
set tags+=rtags
Ahora cuando lo haga :Rtags
vim 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 formato de etiquetas Emacs y 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 busque un archivo rtags
además del archivo de tags
habitual (ver :h tags-and-searches
)
Esta es una modificación de la respuesta de Henrico, y puede implementarse copiando y pegando el siguiente código en sus archivos ~ / .ctags. El código de Henrico no funcionó para las funciones con sangría, pero el siguiente código sí lo hace.
--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 con ctags y funciones. Si está utilizando el complemento vim taglist, entonces, le permite distinguir entre variables globales y otras variables. Además, si está utilizando la lista de etiquetas, deberá pegar lo siguiente en su vimrc.
let tlist_r_settings = ''R;f:Functions;g:GlobalVariables;v:FunctionVariables''
Este es el contenido de mi archivo .ctags en mi directorio de inicio. Lo encontré en algún lugar 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/
Probablemente pueda leer cómo agregar soporte para un nuevo idioma para ctags.
rtags () es la mejor manera de generar etiquetas para códigos R a partir de lo que veo hasta ahora, ya que tendrá en cuenta todas las diferentes formas de tareas, como:
ok = c("<-", "=", "<<-", "assign",
"setGeneric", "setGroupGeneric", "setMethod",
"setClass", "setClassUnion")
Un ejemplo del uso de 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)