Search code examples
ruby-on-railshistoryirbpry

Rails console history command (via pry) -- can it be grepped or tailed?


In Rails 4 rails console I can type history and it will behave just like the history command from the bash shell. E.g.:

[25] my_rails_project »  history
  1: Nomination
  2: {:ad => "asdfsdasadf"}
  3: Nomination.count
  4: Nomination.count.to_sql
  5: Nomination.all.class
  6: Nomination.all.to_sql
  ...

Is there a way to search that history, e.g. history | grep Nomination? How about tail?

Note: When I initially wrote this question I thought the history command came from Rails itself, but it comes from the pry gem which I have in my system (my Gemfile specifies the jazz_hands gem which pulls in pry). Pry does in fact have a grep feature, e.g. history --grep Nomination will give me lines 1 and 3-6 above. It also has a tail feature. These are documented here: https://github.com/pry/pry/wiki/History


Solution

  • You can use ~/.irb-history for this purpose. So, the following can be used (you must be knowing how to do this, but this is only for reference):

    tail -fn0 ~/.irb-history  # for tailing
    cat ~/.irb-history | grep something # for searching
    

    Note that, you might have both the files: ~/.irb-history and ~/.irb_history, and any one of them can be more up to date than the other. I have not been able to resolve this mystery yet. So, use the one you find more suitable for yourself.


    UPDATE: You can access history in a variable using the following logic (it took me a while to read the code Pry uses, try edit history inside pry):

     def pry_history
       arr = []
       history = Pry::History.new
       history.send(:read_from_file) do |line|
         arr.push line.chomp
       end
       arr
     end
    

    Now, you can simply call pry_history to get an array of pry's history. You can further save it inside your .pryrc configuration file and use it whenever you want in pry.