25

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

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

我已经比较了IRB.conf工作会话和非工作会话之间的值,并且没有什么不合适的(尽管奇怪的是,irb/ext/save-history.rb在这两种情况下都是一个空白文件)。

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

我已经尝试了rbenv irb history 中列出的答案,如果没有成功就不会保存。

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

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

我知道我可以切换到像 pry 这样的东西,但我想弄清楚这一点。关于为什么没有将命令添加到 Readline 以及如何更改它的任何建议?

4

1 回答 1

42

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

在下面,2.3.0可以是从 2.2.0 开始的任何 Ruby 版本。我写2.3.0的,因为那是埃文使用的。

使用自制软件

如果您使用自制软件安装 ruby​​,它将带有 readline 的工作版本。

  • brew install ruby

然后按照说明将其添加到您的 PATH 中。然后执行 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 会自动检测 homebrew 并在其中查找 readline,因此,如果您使用的是 Homebrew 并且 irb 历史记录不起作用,那么您要么没有安装 readline,要么在安装 readline 之前构建了 Ruby。

  • brew install readline如果尚未安装
  • rbenv uninstall 2.3.0
  • rbenv install 2.3.0
于 2016-06-16T00:26:45.917 回答