From: shibata.hiroshi@... Date: 2014-01-30T06:17:10+00:00 Subject: [ruby-dev:47937] [ruby-trunk - Bug #8782] Don't set rl_getc_function on editline Issue #8782 has been updated by Hiroshi SHIBATA. Target version changed from 2.1.0 to current: 2.2.0 ---------------------------------------- Bug #8782: Don't set rl_getc_function on editline https://bugs.ruby-lang.org/issues/8782#change-44792 * Author: Yui NARUSE * Status: Assigned * Priority: Normal * Assignee: Kouji Takao * Category: ext * Target version: current: 2.2.0 * ruby -v: ruby 2.1.0dev (2013-08-12 trunk 42528) [x86_64-darwin12.4.0] * Backport: 1.9.3: UNKNOWN, 2.0.0: UNKNOWN ---------------------------------------- r42402 以来 OS X 等の editline 環境では #define rl_getc(f) EOF が使われるようになってしまって残念なことになっていたわけですが、 そもそも editline の readline wrapper は non ASCII に対応していません。 (editline 自体には UTF-8 のみの対応が入ったが、readline wrapper は src/readline.c の _getc_function を経由するので non ASCII は化ける) ので、いっそ rl_getc_function を使わないようにしてはどうでしょう。 以下のようなパッチを当てると、readline なしの OS X の irb で日本語が使えるようになります。 diff --git a/ext/readline/extconf.rb b/ext/readline/extconf.rb index 0b121c1..bc0ee77 100644 --- a/ext/readline/extconf.rb +++ b/ext/readline/extconf.rb @@ -94,4 +94,5 @@ readline.have_func("clear_history") readline.have_func("rl_redisplay") readline.have_func("rl_insert_text") readline.have_func("rl_delete_text") +readline.have_func("el_init") create_makefile("readline") diff --git a/ext/readline/readline.c b/ext/readline/readline.c index 0f76d1a..85109f0 100644 --- a/ext/readline/readline.c +++ b/ext/readline/readline.c @@ -130,12 +130,7 @@ static VALUE readline_instream; static VALUE readline_outstream; #if defined HAVE_RL_GETC_FUNCTION - -#ifndef HAVE_RL_GETC -#define rl_getc(f) EOF -#endif - -static int readline_getc(FILE *); +# ifndef HAVE_EL_INIT static int readline_getc(FILE *input) { @@ -187,6 +182,7 @@ readline_getc(FILE *input) #endif return FIX2INT(c); } +# endif #elif defined HAVE_RL_EVENT_HOOK #define BUSY_WAIT 0 @@ -1771,7 +1767,9 @@ Init_readline() /* libedit check rl_getc_function only when rl_initialize() is called, */ /* and using_history() call rl_initialize(). */ /* This assignment should be placed before using_history() */ +# ifndef HAVE_EL_INIT rl_getc_function = readline_getc; +# endif #elif defined HAVE_RL_EVENT_HOOK rl_event_hook = readline_event; #endif -- http://bugs.ruby-lang.org/