为Ruby on Rails项目生成emacs标记文件

时间:2012-04-12 09:16:47

标签: ruby-on-rails ruby emacs rvm ctags

我正在使用以下命令为Ruby on Rails项目生成emacs的标记文件:

ctags -f TAGS --extra=-f --languages=-javascript --exclude=.git --exclude=log -e -R . $(rvm gemdir)/gems/

当我尝试查找标签(使用M-。)时,某些标签工作正常,但是有很多其他标签我会收到如下错误:

tag-find-file-of-tag-noselect: File /Users/simao/Documents/sp/ofe/° ¡ not found

etags-goto-tag-location: Rerun etags: `^class Tools::FilteringSteps' not found in /Users/simao/Documents/sp/ofe/lib/geo_db.rb

如何使用emacs为您的RoR项目生成代码?你以前见过这个问题吗?

这是ctags --version

的输出
Exuberant Ctags 5.8, Copyright (C) 1996-2009 Darren Hiebert
Compiled: Mar  9 2012, 15:47:35
Addresses: <dhiebert@users.sourceforge.net>, http://ctags.sourceforge.net
Optional compiled features: +wildcards, +regex

我的emacs版本:

GNU Emacs 24.0.95.1 (x86_64-apple-darwin, NS apple-appkit-1038.36) of 2012-04-02

4 个答案:

答案 0 :(得分:7)

是的,是的,是的。 ; - )

为什么你会首先关心不使用ctags ? Ctags是一个很棒的项目,它确实支持许多(如50种)语言。但Ruby的支持非常弱,解析器状况不佳,而且4年后它还没有改变。

  • Ctags不处理:模块A :: B
  • Ctags不会标记(至少某些)运算符方法,例如==
  • Ctags不支持限定标签,-type = +
  • Ctags不输出常量或属性的标签。

不幸的是所有其他(我发现2)Ruby ctags生成器要么已过时(没有Ruby 1.9+支持),要么非常慢。但有一个解决方案!它被称为 ripper-tags https://github.com/tmm1/ripper-tags

gem install ripper-tags
cd your_project/
ripper-tags -R # for vim
ripper-tags -R -f TAGS # for emacs

该项目利用称为Ripper的内置Ruby解析器API。它很快,它按预期工作。它几乎与ctags一样快,但给出最准确的结果。警告:它不支持Ruby 1.8。

如果您喜欢ripper-tags并且希望在安装gem时自动生成所有标签,您可以查看我的 gem-ripper-tags 。不幸的是,它目前不支持Emacs(接受补丁 - 很容易做到)。更多信息:https://github.com/lzap/gem-ripper-tags

答案 1 :(得分:0)

这似乎可能是相关的:

特别注意第二个链接中的注释,表明自Emacs 22以来已存在此错误。

假设您没有运行Emacs 24,听起来您应该将该补丁应用于etags.el(和字节重新编译)。

(如果您使用的是包含此错误的Emacs 24版本,您显然应该更新到最新的预测试版本。)

答案 2 :(得分:0)

我使用rtags。对我来说,它比Ruby更适合于ctags

答案 3 :(得分:0)

如果您使用的是Git,我建议您在Effortless CTags中使用此设置,以便在执行git操作时自动生成标记文件:

http://tbaggery.com/2011/08/08/effortless-ctags-with-git.html

即使您没有使用Git,您也可以尝试使用他的命令来构建CTag:

ctags --tag-relative -Rf.git/tags.$$ --exclude=.git --languages=-javascript,sql

另外,我建议您为bundle install设置别名以指定路径,以便将您的gem捆绑到项目的子目录中,例如:

alias bi='bundle install --path vendor'

(注意:请确保.gitignore该目录)。这样您就可以直接跳转到每个宝石的来源,并防止您的标记文件被系统中的所有宝石臃肿。