From: Nobuyoshi Nakada Date: 2011-12-21T17:06:48+09:00 Subject: [ruby-dev:45015] Re: Readline.completion_append_character なかだです。 (11/04/30 14:40), Nobuhiro IMAI wrote: > 影響範囲がよく分かっていませんが、Ruby の readline 側で > rl_completion_append_character 相当のものを保持しておいて、補完する時 > にセットしてやればいいのではないでしょうか? > > やってみたら何か動いてそう、というレベルのものですが、参考までにパッチ > を付けてみます。Ruby のスクリプトから readline.so を使う限りはこれでよ > さそうですが、拡張ライブラリから直接 rl_completion_append_character を > いじるようなことがある(のかどうかは分かってません)と破綻しちゃいそうです。 もうちょっとシンプルに、readline()呼び出し前に保存しておいて補完すると きにはそれを使うというのはどうでしょうか。readline()呼び出しの最中に他 のスレッドから変更しても上書きされてしまいますが、元々マルチスレッドで 動かせるものでもないと思います。 diff --git a/ext/readline/readline.c b/ext/readline/readline.c index 198f0e6..e1c8316 100644 --- a/ext/readline/readline.c +++ b/ext/readline/readline.c @@ -70,6 +70,9 @@ static ID id_orig_prompt, id_last_prompt; static int (*history_get_offset_func)(int); static int (*history_replace_offset_func)(int); +#ifdef HAVE_RL_COMPLETION_APPEND_CHARACTER +static int readline_completion_append_character; +#endif static char **readline_attempted_completion_function(const char *text, int start, int end); @@ -258,6 +261,9 @@ insert_ignore_escape(VALUE self, VALUE prompt) static VALUE readline_get(VALUE prompt) { +#ifdef HAVE_RL_COMPLETION_APPEND_CHARACTER + readline_completion_append_character = rl_completion_append_character; +#endif return (VALUE)readline((char *)prompt); } @@ -642,6 +648,9 @@ readline_attempted_completion_function(const char *text, int start, int end) proc = rb_attr_get(mReadline, completion_proc); if (NIL_P(proc)) return NULL; +#ifdef HAVE_RL_COMPLETION_APPEND_CHARACTER + rl_completion_append_character = readline_completion_append_character; +#endif #ifdef HAVE_RL_ATTEMPTED_COMPLETION_OVER rl_attempted_completion_over = 1; #endif -- --- 僕の前にBugはない。 --- 僕の後ろにBugはできる。 中田 伸悦