Rubyのコードを読んでいると「このメソッドはどこで定義されているのだ!」と知りたくなる時がある。そういう時、僕はagで検索するのだけれども、対象にしたいメソッドがdef self.method_name
で定義されているのかdef method_name
で定義されているのか、すぐにわからない。なので、こういう感じのを作っておいて、それを使っている。
function def () { ag "def (self\.)?$1" $2 $3 }
するとこんな感じで出来るので、楽
$ def model_name vendor/bundle/ruby/2.1.0/gems -l vendor/bundle/ruby/2.1.0/gems/actionpack-4.1.10/lib/action_controller/model_naming.rb vendor/bundle/ruby/2.1.0/gems/actionpack-4.2.1/lib/action_controller/model_naming.rb vendor/bundle/ruby/2.1.0/gems/actionview-4.1.10/lib/action_view/model_naming.rb vendor/bundle/ruby/2.1.0/gems/actionview-4.2.1/lib/action_view/model_naming.rb vendor/bundle/ruby/2.1.0/gems/activemodel-4.1.10/lib/active_model/naming.rb vendor/bundle/ruby/2.1.0/gems/activemodel-4.2.1/lib/active_model/naming.rb vendor/bundle/ruby/2.1.0/gems/aws-sdk-v1-1.63.0/lib/aws/record/naming.rb vendor/bundle/ruby/2.1.0/gems/aws-sdk-v1-1.64.0/lib/aws/record/naming.rb vendor/bundle/ruby/2.1.0/gems/brakeman-3.0.2/lib/brakeman/checks/base_check.rb vendor/bundle/ruby/2.1.0/gems/enumerize-0.11.0/test/module_attributes_test.rb vendor/bundle/ruby/2.1.0/gems/ransack-1.6.5/lib/ransack/naming.rb vendor/bundle/ruby/2.1.0/gems/ransack-1.6.6/lib/ransack/naming.rb vendor/bundle/ruby/2.1.0/gems/shoulda-matchers-2.8.0/lib/shoulda/matchers/active_model/allow_value_matcher.rb vendor/bundle/ruby/2.1.0/gems/shoulda-matchers-2.8.0/lib/shoulda/matchers/active_model/errors.rb vendor/bundle/ruby/2.1.0/gems/shoulda-matchers-2.8.0/lib/shoulda/matchers/active_record/uniqueness/test_model_creator.rb vendor/bundle/ruby/2.1.0/gems/shoulda-matchers-2.8.0/spec/support/unit/record_validating_confirmation_builder.rb vendor/bundle/ruby/2.1.0/gems/shoulda-matchers-2.8.0/spec/support/unit/record_with_different_error_attribute_builder.rb
そうすると「あ〜ワシが知りたかったのはactive_model/naming.rbのやつや〜」とかわかる。嬉しい。
define_methodとか使われていたりするとこの方法では無理なので、binding.pry入れてから実行してsource_location見るとかしている。もっといい感じの方法知りたい。