Ruby ctags 替代物: ripper-tags

luikore · 2013年12月08日 · 最后由 aptx4869 回复于 2013年12月08日 · 3882 次阅读

https://github.com/tmm1/ripper-tags

gem ins ripper-tags
ripper-tags -R my/project/folder

对比了下,类宏不能识别……而 ctags 是可以的

#1 楼 @aptx4869 ctags 也不能,它的主要作用是准确判断 def f;end; def g;end 这类样子不标准的签名

#1 楼 @aptx4869 attr_accessor 可以识别,算是类宏吧?

看它的源码 https://github.com/tmm1/ripper-tags/blob/master/lib/ripper-tags/parser.rb#L67 ,对 define_methodattr_accessor 都做了处理。比 ctags 棒

#2 楼 @luikore 奇怪了,我这里 ctags 可以……换 ripper-tags 就不行了……

还是说我说的有歧义么?通常是需要看类宏是怎么做的,而不是看类宏做出了些什么吧,根本没人会需要在topic.user上跳转去belongs_to :user这一行的,反而有时需要在acts_as_voteable这里跳去看它的定义

#3 楼 @fancy 用到 define_method 这种元编程的一般是运行时才知道内容,只用 parser 处理和没处理一样,比如我这里用到的全都不可能识别的……

#4 楼 @aptx4869 额 我错了…… 动态定义的肯定不能用 parse 来解决

#4 楼 @aptx4869 应该是你的 ctags 配置里 (~/.ctags ?) 加了 --regex-ruby=/^[ \t]*has_many.../ 的正则?

ripper-tags 好像也有... https://github.com/tmm1/ripper-tags/blob/master/lib/ripper-tags/parser.rb#L69

#4 楼 @aptx4869 是不是你 ctags 时候配置了什么去包含 gems,用 ripper-tags 的时候没有加上?像 has_many 这些方法去是 gems 提供的,只索引应用目录下的文件肯定就不包括了。

#6 楼 @luikore #7 楼 @doitian 我现在用的是 guard-ctags-bundler 这个 gem,按默认设置定期手动运行,看源码应该是直接ctags -R --languages=ruby

def generate_tags(path, tag_file)
  ....
  cmd = "#{@opts[:binary] || 'ctags'} -f #{tag_file} #{@opts[:arguments] || '-R --languages=ruby'}"
  cmd << " -e" if @opts[:emacs]
  cmd << " #{path}"
  system(cmd)
  ....
    end
  end
end

关键不是 has_many 这些,那只是顺手截图截到了……关键是其他 gem 中的一些黑魔法,包括我自己项目中定义的类宏都能用 ctags 这样直接跳转,ripper-tags 就不行,即使是项目中定义的,粗略看了下貌似写在 concern 里的都没有……

#8 楼 @aptx4869 都是 concern 的错...

#9 楼 @luikore 问题是写 gem 的很多都大量的在用 concern……

需要 登录 后方可回复, 如果你还没有账号请 注册新账号