Search code examples
rubyirb

irb history not working


in ~/.irbrc i have these lines:

require 'irb/ext/save-history'
#History configuration
IRB.conf[:SAVE_HISTORY] = 100
IRB.conf[:HISTORY_FILE] = "#{ENV['HOME']}/.irb-save-history"

and yet when i run irb and hit the up arrow nothing happens. also the irb history file specified is not getting created and nothing is logged to it.


Solution

  • I don't have an answer for you why the above doesn't work, but I did find a file, /etc/irbrc on my system (OS X - Snow Leopard, Ruby 1.8.7) that does provide a working, persistent history for me. So two pieces of advice: i) check your /etc/irbrc (or equivalent) to make sure that there isn't anything in there that might interfere with your settings, and ii) try out the settings below to see if you can get history working that way.

    # Some default enhancements/settings for IRB, based on
    # http://wiki.rubygarden.org/Ruby/page/show/Irb/TipsAndTricks
    
    unless defined? ETC_IRBRC_LOADED
    
      # Require RubyGems by default.
      require 'rubygems'
    
      # Activate auto-completion.
      require 'irb/completion'
    
      # Use the simple prompt if possible.
      IRB.conf[:PROMPT_MODE] = :SIMPLE if IRB.conf[:PROMPT_MODE] == :DEFAULT
    
      # Setup permanent history.
      HISTFILE = "~/.irb_history"
      MAXHISTSIZE = 100
      begin
        histfile = File::expand_path(HISTFILE)
        if File::exists?(histfile)
          lines = IO::readlines(histfile).collect { |line| line.chomp }
          puts "Read #{lines.nitems} saved history commands from '#{histfile}'." if $VERBOSE
          Readline::HISTORY.push(*lines)
        else
          puts "History file '#{histfile}' was empty or non-existant." if $VERBOSE
        end
        Kernel::at_exit do
          lines = Readline::HISTORY.to_a.reverse.uniq.reverse
          lines = lines[-MAXHISTSIZE, MAXHISTSIZE] if lines.nitems > MAXHISTSIZE
          puts "Saving #{lines.length} history lines to '#{histfile}'." if $VERBOSE
          File::open(histfile, File::WRONLY|File::CREAT|File::TRUNC) { |io| io.puts lines.join("\n") }
        end
      rescue => e
        puts "Error when configuring permanent history: #{e}" if $VERBOSE
      end
    
      ETC_IRBRC_LOADED=true
    end