rb-readlineをあれするびみょうなほうほう

git cloneしたところのGemfileに入ってていかんともしがたく〜というとき話。

[1] pry(main)> ���������
/.../lib/ruby/gems/2.2.0/gems/pry-0.10.1/lib/pry/history.rb:106:in `write': "\xE3" from ASCII-8BIT to UTF-8 (Encoding::UndefinedConversionError)

となるやつ。rb-readlineがRuby 1.9以降では入出力をASCII-8BITで扱おうとしているっぽいのに対し、pryのヒストリファイルの読み書きはデフォルトに従う。これがくいちがった結果。

回避その一。ヒストリファイルを使わない。

pry wikiに従って書き込まないようにする。

# ~/.pryrc
Pry.config.history.should_save = false

これはそんなにアレじゃない。

回避その二。pryにムリヤリにでもASCII-8BITで書き込みさせる。

if defined?(RbReadline)
  class Pry::History
    class File < ::File
      def self.open(path, mode, perm)
        mode = "#{mode}:ascii-8bit" unless /:/ =~ mode
        ::File.open(path, mode, perm)
      end
    end
  end
end

まあ、アレです。

回避その三。pryにムリヤリにでもreadlineを使わせる。

if defined?(RbReadline)
  readline_so = "readline.#{RbConfig::CONFIG['DLEXT']}"
  if $LOAD_PATH.detect { |d| File.exists?("#{d}/#{readline_so}") }
    class Object
      remove_const :Readline
    end
    require readline_so
  end
end

アレです。

rb-readlineでないとしかたないっていう状況でなければrb-readline止めようよっていう話にするのがよいわけですが。