なかだです。

(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はできる。 中田 伸悦