15

当我将以下文本粘贴到在 ruby​​-enterprise-2011.03 下运行的 IRB 或 PRY 中时,需要 13 秒。

# Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.

在同一台计算机上运行 irb 和其他 ruby​​ 安装时,粘贴并不慢。

  jruby-1.5.6
  jruby-1.6.3
  ruby-1.8.6-p420
  ruby-1.8.7-p352
  ruby-1.9.1-p431
  ruby-1.9.2-p290
  ruby-1.9.3-preview1
  or Mac OS X's default system install of 1.8.7-p249

这个问题与Rails 控制台在编辑文本时运行速度非常慢有关,但我没有使用 rvm,并且在编写、编辑或删除文本时没有缓慢;只有粘贴很慢。@fl00r 的建议有效,但这不是永久修复。

此外,如果粘贴的文本中有硬换行符,则只有最后一行很慢。例如,粘贴以下文本只需大约 1.5 秒

# Lorem ipsum dolor sit amet, consectetur adipisicing elit, 
# sed do eiusmod tempor incididunt ut labore et dolore magna 
# aliqua. 

我注意到 REE 加载了 libreadline 的副本,其他 ruby​​ 安装都没有加载。有没有办法配置和编译 REE 以忽略 MacPorts 中的 libreadline 文件?

require 'readline'
puts `lsof -p #{$$} | grep -i readline | awk '{print $9}'`
puts

我在几个 ruby​​ 安装上运行了上面的脚本。只有底部的 2 个安装(REE 安装)包含额外的 libreadline。

=== ruby-1.8.6-p36 ======================
/opt/ruby-1.8.6-p36/lib/ruby/1.8/i686-darwin11.2.0/readline.bundle

=== ruby-1.8.6-p420 ======================
/opt/ruby-1.8.6-p420/lib/ruby/1.8/i686-darwin11.0.1/readline.bundle

=== ruby-1.8.7-p352 ======================
/opt/ruby-1.8.7-p352/lib/ruby/1.8/i686-darwin11.0.1/readline.bundle

=== ruby-1.9.1-p431 ======================
/opt/ruby-1.9.1-p431/lib/ruby/1.9.1/i386-darwin11.0.1/readline.bundle

=== ruby-1.9.2-p290 ======================
/opt/ruby-1.9.2-p290/lib/ruby/1.9.1/x86_64-darwin11.0.1/readline.bundle

=== ruby-1.9.3-preview1 ==================
/opt/ruby-1.9.3-preview1/lib/ruby/1.9.1/x86_64-darwin11.0.1/readline.bundle

=== ruby-enterprise-1.8.7-2011.03 ========
/opt/ruby-enterprise-1.8.7-2011.03/lib/ruby/1.8/i686-darwin11.0.1/readline.bundle
/opt/local/lib/libreadline.6.2.dylib

=== ruby-enterprise-1.8.7-2012.01 ========
/opt/ruby-enterprise-1.8.7-2012.01/lib/ruby/1.8/i686-darwin11.2.0/readline.bundle
/opt/local/lib/libreadline.6.2.dylib
4

4 回答 4

4

这是 Readline 和 UTF-8 终端的问题。我没有花时间追查真正的问题出在哪里,但是,如果您将 $LANG 设置为其他值,问题就会消失。

这不是一个永久的解决方案。

另一个快速解决方法是在粘贴文本后键入一个附加字符。

如果您将 ruby​​ 重新编译为不使用 Readline,您也可以重新使用 OSX 的 editline 库。可悲的是,这有它自己的问题,例如 ruby​​s readline 块线程的编辑线兼容性。

我还应该注意到,不仅仅是 ruby​​ 遇到了这个问题,自 Snow Leopard 以来,我已经在 OSX 上的其他 readline 实现中看到了它。

于 2011-09-28T18:29:50.447 回答
0

也许安装纯红宝石readline?

于 2012-02-10T20:09:22.217 回答
0

它看起来像 REE 的installer.rb添加-I/opt/local/include-L/opt/local/lib -Wl,链接器标志。清除这些标志后,REE 编译成功,不包含第二个 readline 库,但由于其他加载错误,生成的 ruby​​ 将不会执行。

一个解决方案是在安装 REE 时暂时删除 MacPorts,这样它就不会链接到额外的 readline 库。

  1. 退出所有正在访问 MacPorts 文件的进程。你可以看到哪些正在运行sudo lsof | grep /opt/local
  2. sudo mv /opt/local /opt/localbak
  3. 打开一个新的终端,然后编译并安装 REE
  4. sudo mv /opt/localbak /opt/local

之后,REE 安装将与 MacPorts 一起正常工作。

其他解决方案:

  • 永久卸载 MacPorts,照常安装 REE
  • 使用 MRI 或其他版本的 Ruby 代替 REE

编辑:我注意到使用ruby​​-build安装 REE不会出现这个问题

于 2012-03-20T19:27:54.750 回答
0

尝试添加:

IRB.conf[:USE_MULTILINE] = false

到您的~/.irbrc文件,并重新启动 irb (或运行load '~/.irbrc'

于 2021-04-20T13:17:41.160 回答