为什么撬历史会阻止历史?

时间:2015-12-29 20:44:44

标签: ruby pry

当我使用撬时,撬的历史会覆盖我的irb历史并且非常烦人。如果我使用撬,我想看到撬的历史,如果我使用irb,我想看看irb的历史。我的配置中是否存在明显问题?

~/.irbrc看起来像

IRB.conf[:AUTO_INDENT] = true
IRB.conf[:USE_READLINE] = true
IRB.conf[:LOAD_MODULES] = [] unless IRB.conf.key?(:LOAD_MODULES)
unless IRB.conf[:LOAD_MODULES].include?('irb/completion')
  IRB.conf[:LOAD_MODULES] << 'irb/completion'
end
IRB.conf[:SAVE_HISTORY] = 1000

我的.pryrc文件为空,基于文档向我指出pry应该使用.pry_history,这似乎正在发生。

/etc/irbrc看起来像

# 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

1 个答案:

答案 0 :(得分:0)

为什么会出现问题

Pry和IRB都将他们的历史记录到Readline::HISTORY。当您从IRB(或rails console)输入Pry时,您已将所有IRB历史记录都放在Readline::HISTORY中。然后Pry加载它的历史。退出Pry时Readline::HISTORY未被更改,因此您最终返回IRB,并将所有Pry的历史记录添加到IRB的历史记录中。最后,当您退出IRB时,它会将包含Pry的历史记录写入IRB的历史文件,从而破坏它。

问题的当前状态

我做了一些搜索,发现这是一个known issue与Pry。我对这个问题也很感兴趣所以我设法制定了一个等待pull request review的解决方案。

解决方法直到合并

如果你想在它合并之前尝试一下,你可以从我在Pry的分支上创建的分支中获取版本。您可以在分支save_irb_history_and_replace_on_close下的https://github.com/agrberg/pry找到它。如果您使用bundler,您需要做的就是将您的行添加或更新为:

gem 'pry', git: 'git@github.com:agrberg/pry.git', branch: 'save_irb_history_and_replace_on_close'