summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog6
-rw-r--r--ext/readline/readline.c16
-rw-r--r--test/readline/test_readline.rb15
3 files changed, 33 insertions, 4 deletions
diff --git a/ChangeLog b/ChangeLog
index e0a78c4805..2b76fc7807 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -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)