From e2ad92a075bdcbffcae9afbb7dab9918f690fa14 Mon Sep 17 00:00:00 2001 From: nobu Date: Mon, 18 Jun 2012 01:43:00 +0000 Subject: ext/readline/readline.c: [Bug #6601] * ext/readline/readline.c (readline_getc): deal with ESC just followed by ASCII as meta prefix in incremental search mode. based on the patch from rctay (Tay Ray Chuan) at [ruby-core:45682]. [Bug #6601] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@36123 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- ext/readline/readline.c | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) (limited to 'ext') 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 -- cgit v1.2.3