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>
|
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
|
* 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
|
#if defined HAVE_RL_GETC_FUNCTION
|
||||||
static VALUE readline_instream;
|
static VALUE readline_instream;
|
||||||
static ID id_getbyte;
|
|
||||||
|
|
||||||
#ifndef HAVE_RL_GETC
|
#ifndef HAVE_RL_GETC
|
||||||
#define rl_getc(f) EOF
|
#define rl_getc(f) EOF
|
||||||
|
@ -173,9 +172,19 @@ readline_getc(FILE *input)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
c = rb_funcall(readline_instream, id_getbyte, 0, 0);
|
c = rb_io_getbyte(readline_instream);
|
||||||
if (NIL_P(c)) return EOF;
|
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
|
#elif defined HAVE_RL_EVENT_HOOK
|
||||||
#define BUSY_WAIT 0
|
#define BUSY_WAIT 0
|
||||||
|
@ -1703,7 +1712,6 @@ Init_readline()
|
||||||
/* and using_history() call rl_initialize(). */
|
/* and using_history() call rl_initialize(). */
|
||||||
/* This assignment should be placed before using_history() */
|
/* This assignment should be placed before using_history() */
|
||||||
rl_getc_function = readline_getc;
|
rl_getc_function = readline_getc;
|
||||||
id_getbyte = rb_intern_const("getbyte");
|
|
||||||
#elif defined HAVE_RL_EVENT_HOOK
|
#elif defined HAVE_RL_EVENT_HOOK
|
||||||
rl_event_hook = readline_event;
|
rl_event_hook = readline_event;
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -399,6 +399,21 @@ class TestReadline < Test::Unit::TestCase
|
||||||
end
|
end
|
||||||
end if !/EditLine/n.match(Readline::VERSION)
|
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
|
private
|
||||||
|
|
||||||
def replace_stdio(stdin_path, stdout_path)
|
def replace_stdio(stdin_path, stdout_path)
|
||||||
|
|
Loading…
Reference in a new issue