簡體   English   中英

將文本粘貼到 IRB 中非常慢。 閱讀線問題?

[英]Pasting text into IRB is incredibly slow. Readline issue?

當我將以下文本粘貼到在 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 的編輯行庫。 可悲的是,這帶來了它自己的問題,例如 ruby​​s readline 塊線程的編輯行兼容性。

我還應該注意,不僅僅是 ruby​​ 遇到這個問題,自從 Snow Leopard 以來,我已經在 OSX 上的其他 readline 實現中看到了它。

嘗試添加:

IRB.conf[:USE_MULTILINE] = false

到您的~/.irbrc文件,然后重新啟動 irb(或運行load '~/.irbrc'

也許安裝純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查看哪些正在運行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 沒有出現這個問題

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM