【问题标题】:IRB history not working with Ruby 2.3.0IRB 历史不适用于 Ruby 2.3.0
【发布时间】:2016-10-17 07:11:40
【问题描述】:

我在 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 is not saving 中列出的答案,但没有成功。

我还尝试了irb history not working 中的选定答案。 我必须更改所选答案以替换 #nitems 方法。这表明正在从历史文件中读取行,并推送到Readline::HISTORY。但是,检查 Readline::HISTORY 并没有显示任何内容。

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

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

【问题讨论】:

  • 你说的一件事我觉得很奇怪:你说 save-history.rb 是空白的。我的~/.rbenv/versions/2.3.0/lib/ruby/2.3.0/irb/ext/save-history.rb 充满了使历史工作的代码。我想如果你的是空白的,无论有没有 readline,irb 历史都不会工作。
  • 嗯。我不再拥有原来的 2.3.0,但我只是回去查看了我的 2.0.0,并且 save-history.rb 文件中确实有代码。我没有任何解释,除了我的大脑因为挖掘这个而有点炸了。

标签: ruby macos readline irb ruby-2.3


【解决方案1】:

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,因为这是 Evan 使用的。

使用自制软件

如果你使用自制软件安装 ruby​​,它会带来一个工作版本的 readline。

  • brew install ruby

然后按照说明将其添加到您的 PATH 中。然后executegem 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

【讨论】:

  • 谢谢戴夫!现在编译,一旦我可以验证将接受。顺便说一句,作为我正在进行的研究的一部分,我刚刚在 stackoverflow.com/questions/37617519/… 上投票支持你的问题/答案。
  • 我写了一个作为调查 irb 问题的副产品。我们一直在同一条路上。
  • 谢谢,我在 OS X 上运行 rails console 时遇到了这个确切的问题,通过 rbenv 安装了 Ruby。此外,我还会收到错误“无法读取 termcap 数据库;使用哑终端设置”。这似乎也解决了这个问题。
  • 为了让它工作,我将IRB.conf[:SAVE_HISTORY] = 100000添加到~/.irbrc
  • 我认为不设置 SAVE_HISTORY 有点不同:如果你忘记了这一点,历史将不会被写入,而不是替换上一个会话的历史。
猜你喜欢
  • 2011-01-05
  • 1970-01-01
  • 1970-01-01
  • 2011-03-04
  • 2023-03-11
  • 1970-01-01
  • 2013-07-06
  • 1970-01-01
  • 2012-06-23
相关资源
最近更新 更多