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

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (14)

我使用以下命令为我的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
提问于
用户回答回答于

etags似乎在这一点上与ruby一起工作良好。Ctags可能也是。

这是我为管理标签而写的一个任务。将其另存为lib/tasks/etags.rake,然后rake etags create定期运行。如果你使用vi,用ctags替换etags。

def project_root
  gemfile_path = ENV['BUNDLE_GEMFILE']
  if !gemfile_path || gemfile_path.empty?
    then fail "can't find the root of your project from $BUNDLE_GEMFILE"
    else File.dirname gemfile_path
  end
end

namespace :etags do
  desc "generate tags for emacs code hypertext linking aka metadot"
  task create: :environment do
    system "find #{project_root}/app/ -iname \\*.rb -print0 | xargs -0 etags"
  end

  desc "remove tags for emacs code hypertext linking aka metadot"
  task clean: :environment do
    system "rm #{project_root}/TAGS"
  end
end
用户回答回答于

为什么你会在乎不使用ctags?Ctags是一个很棒的项目,它支持许多(50种)语言。但是Ruby的支持非常薄弱,解析器状况不佳,并且4年没有改变。

  • Ctags不处理:module A::B
  • Ctags不会标记(至少部分)像==这样的运算符方法
  • Ctags不支持合格的标签,-type = +
  • Ctags不输出常量或属性的标签。

Ruby ctags生成器要么过时(不支持Ruby 1.9+),要么非常慢。但有一个解决方案!它被称为ripper-tagshttps://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。

扫码关注云+社区