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



我正在使用以下命令为我的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

是的,是的,是的。

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

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

不幸的是,所有其他(我发现 2)Ruby ctags 生成器要么过时(不支持 Ruby 1.9+),要么非常慢。但是有一个解决方案!它被称为开膛手标签。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。它很快,并且可以按预期工作。它几乎和ctag一样快,但给出的结果最准确。警告:它不支持 Ruby 1.8。

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

这似乎是相关的:

  • http://lists.gnu.org/archive/html/bug-gnu-emacs/2011-11/msg00079.html
  • http://lists.gnu.org/archive/html/bug-gnu-emacs/2012-03/msg00550.html

特别要注意第二个链接中的评论,表明这个错误从 Emacs 22 开始就存在了。

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

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

我使用rtags。对我来说,它与 Ruby 配合得比 ctag 更好。

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

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

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

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

此外,我建议您为捆绑安装设置一个别名以指定路径,以便您的 gem 捆绑到项目的子目录中,例如:

alias bi='bundle install --path vendor'

(注意:请务必 .gitignore 该目录)。这将允许您直接跳转到每个 gem 的来源,并防止您的标签文件因系统中的所有 gem 而膨胀。

最新更新