Windows版のRubyはANSIエスケープシーケンスをいい感じに処理してくれる?
夏コミ終わりましたね。 参加された方々はお疲れ様でした。
さて、最近ちょっと気付いたのですが、 Windows版のRubyはANSIエスケープシーケンスをいい感じに処理してくれるっぽいのです。 ほとんどのRubyistの方々には常識なのかも知れませんが、 ちょっと感動したので記事として書かせていただきます。
ANSIエスケープシーケンスとは
以下のリンクの方を参照していただければ、よく分かると思います。 要は、コンソールで文字色を付けたりカーソルを動かしたりするための 特殊な文字列のことです。 こういった規格があるおかげで、Vimのカラースキームとかが可能になるわけですね。
- ANSI escape code - Wikipedia, the free encyclopedia
- ASCII Table - ANSI Escape sequences
- 碧色工房 - ANSIエスケープコード - コンソール制御
- エスケープシーケンスを体感する - ザリガニが見ていた...。
Windows環境とANSIエスケープシーケンス
Windowsは標準ではANSIエスケープシーケンスに対応していないらしく、 以下のANSICONをインストールするとか、Cygwin(Mintty)やbash(Git/MSYS)を使うとか、 以前のエントリで書いたように ConEmuをはじめとするコンソールエミュレータを使うこととかでようやく色付きの文字が出せるようになります。
対応していない場合は意味不明な文字列、つまりANSIエスケープシーケンスそのものが表示されることになります。
Rubyだと何だというのか、
ANSIエスケープシーケンスをつけて、色付きの文字列を出力してみたいと思います。 Perl、Python、Rubyの3つの言語で、ごくごく単純なコードを作ってみました。
print("\033[38;5;64m hoge \033[0m\n");
print "\033[38;5;64m hoge \033[0m"
puts "\033[38;5;64m hoge \033[0m"
さて、これら3つのスクリプトを、ANSIエスケープシーケンスに対応している ConEmu上で実行してみると、以下のように緑色の文字列を出力することができます*1。
では、今度はANSIエスケープシーケンスに対応していない生のコマンドプロンプトで 同じスクリプトを実行してみると、以下のようになります。
はい。 見て分かりますね。 RubyだけANSIエスケープシーケンスが表示されてないんです。
どういうふうに処理しているのか分からないのですが、 Rubyだけ、内部で特別に処理を行って、対応していない場合は出力しないようにしてくれるようです。 Rubyすごい。
補足
環境(バイナリ)依存かもしれないので、一応使っているRubyについて補足しておきます。 僕の環境ではRubyInstaller版のRuby 2.2.2(x64)を使用しています。