将文本粘贴到IRB非常慢。 Readline问题?

当我将以下文本粘贴到在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 

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

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

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

如果你重新编译ruby不使用Readline,你可以选择回到使用OSX的editline lib。 遗憾的是,这带来了它自己的问题,例如rubys readline块线程的editline兼容性。

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

也许安装纯rubyreadline?

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

解决方案是在安装REE时临时删除MacPorts,以便它不会链接到额外的readline库。

  1. 退出正在访问MacPorts文件的所有进程。 您可以看到哪些正在运行sudo lsof | grep /opt/local 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不会出现此问题