From: arton Date: 2010-09-11T00:55:20+09:00 Subject: [ruby-dev:42232] 1.9.2 readline can't handle cursorkeys, mbcs chars etc (msvcrt) --------_4C8A3F8A0000000026A3_MULTIPART_MIXED_ Content-Type: text/plain; charset="ISO-2022-JP" Content-Transfer-Encoding: 7bit artonです。 ちょっと迷いがあるので、gdgdな長文ですみません。 現象) ruby-1.9.2-p0のext/readline と GNU readline 4.3-2 (win32) で、カーソルキー や、Homeキー、Endキーなどが処理されません。また、IMEを有効にした漢字入力 が行えません(MSBがオフのバイトのみが処理される)。 これは、MSWin32だけではなくMingwでも同様のはずです。 原因) 特殊キーが処理できない問題と、漢字入力ができない問題はそれぞれ異なる原因 です。 特殊キーが処理できないのは、win32.cがコンソール読み込みに利用している ReadFile Win32APIがカーソルキーなどの特殊キーを無視することと(Windowsで はこれらのキーに文字列(エスケープシーケンス)が割り当てられていないため、 そもそも処理できない)です。 漢字入力ができないのは、ext/readlineが読み込みに利用しているIO.getbyteが charを返すためlibreadlineが期待しているintにするときに符号拡張されて2バ イトコードを構成する文字コードと判断されないためです。 対応案) 後者については、汎用性があるので0xffでマスクする修正で良いのですが、それ では前者が救われません。人によるとは思いますが、カーソルキーやHomeキーな どを利用したいユーザも存在するので、できれば前者も救いたいと思います。 それで、キー入力の有無を判定して無ければスレッド切り替え器を呼び出し、有 ればlibreadlineのキー入力処理を呼び出す添付のパッチを作ったのですが、GNU readline 4.3.2のWin32ポーティング版に依存した修正なのが気に食わない点で す。 別案) というわけで、win32.cの中でコンソール入力時にはReadFile APIではなく ReadConsoleInput APIのようにキーコードを取れるAPIを利用して、その結果を ANSIのコードに変換し(たとえば↑ならCSI (ESC [)A)、libreadlineについて は現在のwin32ポーティング版とは別に(利用したい人が)用意する、というの が良いのではないかと思います。 結論) とりあえず、現在のMSWIN32でのext/readlineはカーソルキーなどのハンドリン グができず、漢字入力にバグがあります。添付のパッチで修正できます (test/readline/test_readline* が通るのは確認しています)。なので、当てて いただけると短期的には嬉しいです。 が、可能なら汎用的に外部ライブラリとインターフェイスできるように、特殊キー をANSIコードに変換すると良いなぁと考えます。 -- arton --------_4C8A3F8A0000000026A3_MULTIPART_MIXED_ Content-Type: application/octet-stream; name="readline.patch" Content-Disposition: attachment; filename="readline.patch" Content-Transfer-Encoding: base64 KioqIHJlYWRsaW5lLmN+CVRodSBBcHIgMjIgMTc6MDQ6MTMgMjAxMA0KLS0tIHJlYWRsaW5lLmMJ RnJpIFNlcCAxMCAyMzo0MTozNCAyMDEwDQoqKioqKioqKioqKioqKiogcmVhZGxpbmVfZ2V0YyhG SUxFICppbnB1dCkNCioqKiAxMTcsMTIyICoqKioNCi0tLSAxMTcsMTUwIC0tLS0NCiAgICAgIGlm ICghcmVhZGxpbmVfaW5zdHJlYW0pIHJldHVybiBybF9nZXRjKGlucHV0KTsNCiAgICAgIEdldE9w ZW5GaWxlKHJlYWRsaW5lX2luc3RyZWFtLCBpZnApOw0KICAgICAgaWYgKHJsX2luc3RyZWFtICE9 IGlmcC0+c3RkaW9fZmlsZSkgcmV0dXJuIHJsX2dldGMoaW5wdXQpOw0KKyAjaWYgZGVmaW5lZChf V0lOMzIpDQorICAgICB7DQorICAgICAgICAgSU5QVVRfUkVDT1JEIGlyOw0KKyAgICAgICAgIGlu dCBuOw0KKyAgICAgICAgIHN0YXRpYyBpbnQgcHJpb3Jfa2V5ID0gJzAnOw0KKyAgICAgICAgIGZv ciAoOzspIHsNCisgICAgICAgICAgICAgaWYgKHByaW9yX2tleSA+IDB4ZmYpIHsNCisgICAgICAg ICAgICAgICAgIHByaW9yX2tleSA9IHJsX2dldGMoaWZwLT5zdGRpb19maWxlKTsNCisgICAgICAg ICAgICAgICAgIHJldHVybiBwcmlvcl9rZXk7DQorICAgICAgICAgICAgIH0NCisgICAgICAgICAg ICAgaWYgKFBlZWtDb25zb2xlSW5wdXQoKEhBTkRMRSlfZ2V0X29zZmhhbmRsZShpZnAtPmZkKSwg JmlyLCAxLCAmbikpIHsNCisgICAgICAgICAgICAgICAgIGlmIChuID09IDEpIHsNCisgICAgICAg ICAgICAgICAgICAgICBpZiAoaXIuRXZlbnRUeXBlID09IEtFWV9FVkVOVCAmJiBpci5FdmVudC5L ZXlFdmVudC5iS2V5RG93bikgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICBwcmlvcl9rZXkg PSBybF9nZXRjKGlmcC0+c3RkaW9fZmlsZSk7DQorICAgICAgICAgICAgICAgICAgICAgICAgIHJl dHVybiBwcmlvcl9rZXk7DQorICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAg ICAgICAgICAgICAgICAgICAgUmVhZENvbnNvbGVJbnB1dCgoSEFORExFKV9nZXRfb3NmaGFuZGxl KGlmcC0+ZmQpLCAmaXIsIDEsICZuKTsNCisgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAg ICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICAgICAgIEhBTkRMRSBoID0gKEhB TkRMRSlfZ2V0X29zZmhhbmRsZShpZnAtPmZkKTsNCisgICAgICAgICAgICAgICAgICAgICByYl93 MzJfd2FpdF9ldmVudHMoJmgsIDEsIElORklOSVRFKTsNCisgICAgICAgICAgICAgICAgIH0NCisg ICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAg ICAgICB9DQorICAgICAgICAgfQ0KKyAgICAgfQ0KKyAjZW5kaWYgICAgDQogICAgICBjID0gcmJf ZnVuY2FsbChyZWFkbGluZV9pbnN0cmVhbSwgaWRfZ2V0Ynl0ZSwgMCwgMCk7DQogICAgICBpZiAo TklMX1AoYykpIHJldHVybiBFT0Y7DQogICAgICByZXR1cm4gTlVNMkNIUihjKTsNCg== --------_4C8A3F8A0000000026A3_MULTIPART_MIXED_-- -------------------------------------- GyaO! - Anime, Dramas, Movies, and Music videos [FREE] http://pr.mail.yahoo.co.jp/gyao/