将文本粘贴到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.

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

  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库。遗憾的是,这带来了它自己的问题,比如ruby的readline块线程的编辑行兼容性。

我还应该注意到,不仅仅是ruby有这个问题,从雪豹开始,我在OSX上的其他readline实现中也看到了这个问题。

也许安装纯ruby readline?

看起来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

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

尝试添加:

IRB.conf[:USE_MULTILINE] = false

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

相关内容

  • 没有找到相关文章

最新更新