2014/02/26(水)Ruby 1.9以降のirbでBackspaceで表示が崩れる

Ruby1.9以降(mswin32版)のirbで、Backspaceでの削除時に表示が崩れる問題。

環境はWindows7(64bit)。

消そうとした文字の1文字手前が消えたり、カーソルがプロンプトにめり込んだりとなかなかに怪しい。

画面にフラッシュされるのも数秒程度の遅延がある場合がある。

内部データは正常、あくまで表示が崩れているだけのようだが煩わしいので直したい。

下参照。

ruby - Backspace and arrow keys aren't working in IRB(Git Bash console) on windows machine - Stack Overflow

とりあえずirbで使用しているreadlineライブラリ周りに問題があるのは間違いない。

--noreadlineオプションを使えば問題は解消するが、Up-Keyでのhistory等は効かなくなる。

mingw32版ではこの問題はない。[2014/03/31 下に追記した]
なんだかめんどくさいなあ。

[2014/03/31追記 ここから]
と上では書いたが、mingw32版でも遅延があった。

irbについては、--noreadlineであっても何か1文字入力すればUp-Keyでhistoryが動くようだ。これでいいことにする。

Windowsの Users\<ユーザ名>以下に設定ファイルを置いてやって、irbはreadline不使用をデフォルトにする。

Users\<ユーザ名>\.irbrc
IRB.conf[:USE_READLINE] = false
ついでに、pryも同様の問題を抱えてるので直したい。
が、pryには--noreadlineオプションがない模様。
しゃーないのでコンフィグを怪しげにいじる。

[参考]
Changing Pry.config.input makes the prompt disappear · Issue #821 · pry/pry · GitHub

pry.config.inputをSTDINに差し替えるとreadlineが外せるらしい。
ただし、これをするとプロンプトを自前で表示しないといけない。

以下を参考に、
Rubyistよ、irbを捨ててPryを使おう - TIM Labs

Users\<ユーザ名>\.pryrc
Pry.config.input = STDIN
Pry.config.output = STDOUT

Pry.config.prompt = [
  proc {|target_self, nest_level, pry|
    nested = (nest_level.zero?) ? '' : ":#{nest_level}" 
    prompt = "[#{pry.input_array.size}] #{RUBY_VERSION}-p#{RUBY_PATCHLEVEL}(#{Pry.view_clip(target_self)})#{nested}> "
    print prompt
    prompt
  },
  proc {|target_self, nest_level, pry|
    nested = (nest_level.zero?) ?  '' : ":#{nest_level}"
    prompt = "[#{pry.input_array.size}] #{RUBY_VERSION}-p#{RUBY_PATCHLEVEL}(#{Pry.view_clip(target_self)})#{nested}* "
    print prompt
    prompt
  }
]
promptの表示を追加。
プロンプト内容はお好みで。
Pry.config.output = STDOUT行が必要かはちゃんと判断していない。

このやり方では入力後に改行が重複出力される問題がある。
また、起動直後にプロンプトがwarningなどと重なるので1回Enterしないといけない。
個人的には許容範囲内だが気になる人は気になるかも。

pry初心者なので、pryの全機能が不足なく動くかは確認していない。
なお、ターミナル上での日本語文字化けが改善するケースがある(追求していない)。

さて、readline周りの挙動は悩ましい。自分でコンパイルすれば直りそうなのだが、やりたくないなあ… やるんだったら配布までやらなきゃだと思うので。
[2014/03/31追記 ここまで]

さて、--noreadlineオプションは記憶しておくとして、Windowsに入れているRubyの措置について考える。

・mswin32版 -> mingw32版にする?
する。PATH環境変数と、スクリプト起動用のexeパスを書き換えた。

とりあえず、mingw32を避けてるのも変なので使ってみるというのが一つ。

mingw32版はcygwin版のようにcygwin周りのファイルが必要ということはないので、mswin32版とほぼ同じように使っていける(はず)。2.1.0が来てないあたり、若干保守的な様子。高速化はmingw32版の方が効いているとのこと。

mswin32版はgemでコンパイルをかけるような場合ではどうもトラブりやすい。pryにしろ、atomicにしろ自分の腕ではgem installに失敗したし、これを打開するためのコストをかけるほどの余裕がない。exerbとかが標準梱包なのは有り難く、gemで追加しない分にはこちらの方が便利か。オフィスでオフラインで使用する場合などではmswin32版の方がうれしいかも。DXRubyが入ってるのも楽しい。

・CP932なrubyスクリプトのエンコードをUTF-8に変える?
変えない。今回は断念して、マジックコメントでWindows-31J指定が入ってないものには追加。

動いてるスクリプトが、コマンドラインから日本語を含むファイル名を受け取って動くようなものが多いため、テストに時間がかかるというのが一つ。

Windowsのファイル名を扱う以上どうしてもSJISで処理したほうが楽だというのも間違いはない。今後UTF-8混じりのファイル名などでバグが起きない限り、既存のスクリプトはこのままにしておいて新規作成分はUTF-8で作ることにする。
OK キャンセル 確認 その他