IRB 历史不适用于 Ruby 2.3.0

IRB history not working with Ruby 2.3.0

我在 OS X 10.11.4 上通过 rbenv 安装了 Ruby 2.3.0p0。在 IRB session 中,历史记录工作正常。但是,我无法跨 session 访问 IRB 历史记录。

我尝试了我的系统 Ruby、2.0.0p648,IRB sessions 的历史记录工作正常。我尝试通过 rbenv 安装相同版本的 Ruby,它也有工作历史。

我比较了工作和非工作 session 之间 IRB.conf 的值,没有任何地方看起来不合适(尽管很奇怪,irb/ext/save-history。 rb 在这两种情况下都是空白文件)。

查看我的 .irb_history 文件,它似乎被最新 session 中的命令替换,而不是附加。我可以加载 2.0.0 IRB session 并滚动浏览这些命令就好了。

我尝试了 rbenv irb history is not saving 中列出的答案,但没有成功。

我也尝试了irb history not working中选择的答案。 我不得不更改所选答案以替换#nitems 方法。这表明正在从历史文件中读出行,并将其推送到 Readline::HISTORY。但是,检查 Readline::HISTORY 那里什么也没有。

我可以通过 Readline.readline 将我的 .irb_history 中的前几行添加到 Readline 历史记录,并指定 add_hist=true 来破解历史记录。但是,将以前的命令添加到 Readline 绝对不是正确的方法。

我知道我可以切换到 pry 之类的东西,但我想解决这个问题。 关于为什么没有将命令添加到 Readline 以及如何更改它的任何建议?

OS X的命令行编辑是基于libedit库的。 OS X 有一个版本的 readline 库,它是 libedit 的包装器,但它的行为并不完全像 GNU readline。 irb history 可以在 Ruby 中使用 OS X 的包装器构建到 Ruby 2.1,但是 Ruby 2.2 及更高版本需要使用 GNU readline 构建才能使 irb history 工作。

下面的2.3.0可以是2.2.0以上的任意Ruby版本。我写了 2.3.0 因为那是 Evan 使用的。

使用 Homebrew

如果您使用 homebrew 安装 ruby,它将带来 readline 的工作版本。

  • brew install ruby

然后按照说明将其添加到您的 PATH 中。然后 execute gem install irb 如果它说 can't find gem irb.

使用 MacPorts

rbenv 不了解 MacPorts,因此您需要明确告诉它使用 MacPorts 的 readline。

  • sudo port install readline 如果尚未安装。
  • rbenv uninstall 2.3.0
  • RUBY_CONFIGURE_OPTS=--with-readline-dir=/opt/local rbenv install 2.3.0

将 Homebrew 与 rbenv 结合使用

rbenv automatically detects homebrew and looks in it for readline,因此,如果您使用的是 Homebrew 并且 irb 历史记录不起作用,则您要么没有安装 readline,要么在安装 readline 之前构建了 Ruby。

  • brew install readline 如果尚未安装
  • rbenv uninstall 2.3.0
  • rbenv install 2.3.0