diff options
Diffstat (limited to 'ext/readline')
-rw-r--r-- | ext/readline/readline.c | 16 |
1 files changed, 12 insertions, 4 deletions
diff --git a/ext/readline/readline.c b/ext/readline/readline.c index 3b1a6c1d6a..07c9268bb5 100644 --- a/ext/readline/readline.c +++ b/ext/readline/readline.c @@ -130,7 +130,6 @@ static char **readline_attempted_completion_function(const char *text, #if defined HAVE_RL_GETC_FUNCTION static VALUE readline_instream; -static ID id_getbyte; #ifndef HAVE_RL_GETC #define rl_getc(f) EOF @@ -173,9 +172,19 @@ readline_getc(FILE *input) } } #endif - c = rb_funcall(readline_instream, id_getbyte, 0, 0); + c = rb_io_getbyte(readline_instream); if (NIL_P(c)) return EOF; - return NUM2CHR(c); + if (c == INT2FIX(ESC) && + RL_ISSTATE(RL_STATE_ISEARCH) && /* isn't needed in other states? */ + rb_io_read_pending(ifp)) { + int meta = 0; + c = rb_io_getbyte(readline_instream); + if (FIXNUM_P(c) && isascii(FIX2INT(c))) meta = 1; + rb_io_ungetbyte(readline_instream, c); + if (meta) rl_execute_next(ESC); + return ESC; + } + return FIX2INT(c); } #elif defined HAVE_RL_EVENT_HOOK #define BUSY_WAIT 0 @@ -1703,7 +1712,6 @@ Init_readline() /* and using_history() call rl_initialize(). */ /* This assignment should be placed before using_history() */ rl_getc_function = readline_getc; - id_getbyte = rb_intern_const("getbyte"); #elif defined HAVE_RL_EVENT_HOOK rl_event_hook = readline_event; #endif |