diff options
-rw-r--r-- | ChangeLog | 6 | ||||
-rw-r--r-- | ext/readline/readline.c | 16 | ||||
-rw-r--r-- | test/readline/test_readline.rb | 15 |
3 files changed, 33 insertions, 4 deletions
@@ -1,3 +1,9 @@ +Mon Jun 18 10:42:57 2012 Nobuyoshi Nakada <nobu@ruby-lang.org> + + * 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] + Sun Jun 17 22:23:53 2012 Nobuyoshi Nakada <nobu@ruby-lang.org> * dir.c (rb_file_directory_p): move documentation for Dir.exist? from 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 diff --git a/test/readline/test_readline.rb b/test/readline/test_readline.rb index 7f00b10721..3352eb19da 100644 --- a/test/readline/test_readline.rb +++ b/test/readline/test_readline.rb @@ -399,6 +399,21 @@ class TestReadline < Test::Unit::TestCase end end if !/EditLine/n.match(Readline::VERSION) + def test_input_metachar + bug6601 = '[ruby-core:45682]' + Readline::HISTORY << "hello" + wo = nil + line = with_pipe do |r, w| + wo = w.dup + wo.write("\C-re\ef\n") + end + assert_equal("hello", line, bug6601) + ensure + wo.close + with_pipe {|r, w| w.write("\C-a\C-k\n")} # clear line_buffer + Readline::HISTORY.clear + end + private def replace_stdio(stdin_path, stdout_path) |