2011-01-25 58 views
19

ctags與R有任何記錄的使用? 這會很有用嗎? 難以實施嗎?Exuberant Ctags with R

具體來說,我剛開始使用Vim。 能夠在一個文件中編寫R函數,在另一個文件(例如,Rnw文件,測試文件或其他腳本)中使用該函數並且能夠使用Ctrl +]導航到功能源。

更新:我自從偶然發現了rtags函數,雖然它暗示它是emacs特有的。

回答

3

可能你可以閱讀how to add support for a new language ctags。

+0

謝謝。我快速瀏覽了一下。我從來沒有使用ctags,所以它可能有點學習曲線。但我打算進一步深入。 – 2011-01-25 14:55:02

9

這是我的主目錄中的.ctags文件的內容。我發現它在互聯網上的某個地方。使用這個你可以爲vim生成一個tags-file。

--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 2012-05-17 17:10:40

+0

@shabbychef因爲函數等的語言定義是相同的,所以不需要使用單獨的Ctags定義。當然,你可以把`--langdef = Splus`改成`--langdef = R`。 – 2012-10-29 10:47:33

+0

你的編輯不太合適,@LMZ - 他們改變了Henrico的答案,以至於不再是他的答案。如果您有更好的解決方案,請將其作爲您自己的答案發布。 – 2013-01-26 22:07:34

11

這是對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,那麼它可以讓你區分全局變量和其他變量。另外,如果您使用的是標籤列表,那麼您需要將以下內容粘貼到您的vimrc中。

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

rtags()是最好的方法,從我所看到的,到目前爲止,因爲它會分配在考慮各種不同的方式,比如生成的R代碼標籤:

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

使用rtags()的一個例子:如所提到的由其它rtags() + etags2ctags()

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

可以生成一個VIM tagsfile(參見:h tags-and-searches)。您可以爲vim創建自定義命令,以便使用Rscript在R中運行rtags()。當你做:Rtags VIM將運行外部進程Rscript(它必須是當然的PATH)和評估rtags(path="./", recursive=TRUE, ofile="RTAGS");etags2ctags("RTAGS", "rtags");unlink("RTAGS")

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

現在:這樣做,把這個在您的.vimrcrtags()將在Emacs tags format中生成RTAGS文件,那麼etags2ctags()會將其轉換爲vim可以讀取的rtags文件。 unlink()刪除RTAGS文件,因爲它不需要vim。

set tags+=rtags使得VIM爲一個rtags文件除了搜索通常的tags文件(見:h tags-and-searches