mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
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
This commit is contained in:
parent
90e812e81b
commit
e2ad92a075
3 changed files with 33 additions and 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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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)
|
||||
|
|
Loading…
Reference in a new issue