Project

General

Profile

Actions

Backport #4635

closed

Readline.completion_append_character

Added by no6v (Nobuhiro IMAI) over 13 years ago. Updated almost 13 years ago.

Status:
Closed
Assignee:
-
[ruby-dev:43456]

Description

=begin
いまいです。

GNU readline library での話ですが、6 系のものを使うと TAB キーでの補完
後に Readline.completion_append_character がデフォルトの " " に戻ってし
まいます。しかも、" " 以外にセットしても、補完された単語にはデフォルト
の " " が付加されます。

require "readline"

p RUBY_DESCRIPTION
p Readline::VERSION
p Readline.completion_append_character
Readline.completion_proc = ->(input){[input]}
IO.pipe do |r, w|
Readline.output = (w << "Readline\t").reopen("/dev/null")
Readline.input = r
Readline.completion_append_character = nil
p Readline.completion_append_character
p Readline.readline
p Readline.completion_append_character
end

Debian GNU/Linux (sid) libreadline-gplv2-dev (5.2-8)

>> "ruby 1.9.3dev (2011-04-29 trunk 31382) [x86_64-linux]"

>> "5.2"

>> " "

>> nil

>> "Readline"

>> nil

Debian GNU/Linux (sid) libreadline6-dev (6.2-1)

>> "ruby 1.9.3dev (2011-04-29 trunk 31382) [x86_64-linux]"

>> "6.2"

>> " "

>> nil (nil にセットは出来るけど)

>> "Readline " (末尾にスペースが付いてしまって)

>> " " (リセットされてしまう)

changelog に以下のように書いてあって、補完後にリセットされるのは意図的
なようです。Ruby の readline 側で何とかならないものでしょうか?

This document details the changes between this version, readline-6.0,
and the previous version, readline-5.2.
(snip)
f. Fixed a bug that caused the completion append character to not be reset to
the default after an application-specified completion function changed it.

Nobuhiro IMAI
Key fingerprint = E57F 2482 4074 13BC 3B9A 165B C689 5B16 A620 4657
=end


Related issues 1 (0 open1 closed)

Related to Ruby master - Feature #1823: Readline Command CompletionRejectedkouji (Kouji Takao)07/28/2009Actions

Updated by naruse (Yui NARUSE) over 13 years ago

  • Category set to ext
  • Status changed from Open to Assigned
  • Assignee set to kouji (Kouji Takao)

=begin

=end

Updated by kouji (Kouji Takao) over 13 years ago

=begin
高尾です。

GNU readline library での話ですが、6 系のものを使うと TAB キーでの補完
後に Readline.completion_append_character がデフォルトの " " に戻ってし
まいます。しかも、" " 以外にセットしても、補完された単語にはデフォルト
の " " が付加されます。
(省略)
changelog に以下のように書いてあって、補完後にリセットされるのは意図的
なようです。Ruby の readline 側で何とかならないものでしょうか?

上記に関して確認させてください。

Readlineについて、いまいさんから2つの相談があったと認識しています。

1)GNU Readline 6の場合にReadline.completion_append_characterにnilを指定できない不具合がある

nilをセットしても補完後にスペースが追加される問題ですね。
こちらは原因を調査して対応したほうがよいと考えています。

2)GNU Readline 6の場合でも5以前と同様の動作にしてほしい

GNU Readline 6では、補完後にReadline.completion_append_characterがデフォルト値へリセットされるので、5以前と同様にリセットされないようにしてほしいことで間違いないでしょうか。こちらについては、私はGNU Readlineでそのような挙動なのであればそれに従ったほうがよいと思っています。GNU Readline本体では、何かしらの理由があってその方がよいと考えて修正したのではないでしょうか。その恩恵を受けられる方がよいのではないでしょうか。それが問題であればGNU Readline本体を修正してもらう方がよいと思います。

以上です。
よろしくお願いします。

On 2011/04/29, at 22:37, Nobuhiro IMAI wrote:

いまいです。

GNU readline library での話ですが、6 系のものを使うと TAB キーでの補完
後に Readline.completion_append_character がデフォルトの " " に戻ってし
まいます。しかも、" " 以外にセットしても、補完された単語にはデフォルト
の " " が付加されます。

require "readline"

p RUBY_DESCRIPTION
p Readline::VERSION
p Readline.completion_append_character
Readline.completion_proc
=end

Updated by kouji (Kouji Takao) over 13 years ago

=begin
高尾です。

GNU readline library での話ですが、6 系のものを使うと TAB キーでの補完
後に Readline.completion_append_character がデフォルトの " " に戻ってし
まいます。しかも、" " 以外にセットしても、補完された単語にはデフォルト
の " " が付加されます。
(省略)
changelog に以下のように書いてあって、補完後にリセットされるのは意図的
なようです。Ruby の readline 側で何とかならないものでしょうか?

上記に関して確認させてください。

Readlineについて、いまいさんから2つの相談があったと認識しています。

1)GNU Readline 6の場合にReadline.completion_append_characterにnilを指定できない不具合がある

nilをセットしても補完後にスペースが追加される問題ですね。
こちらは原因を調査して対応したほうがよいと考えています。

2)GNU Readline 6の場合でも5以前と同様の動作にしてほしい

GNU Readline 6では、補完後にReadline.completion_append_characterがデフォルト値へリセットされるので、5以前と同様にリセットされないようにしてほしいことで間違いないでしょうか。こちらについては、私はGNU Readlineでそのような挙動なのであればそれに従ったほうがよいと思っています。GNU Readline本体では、何かしらの理由があってその方がよいと考えて修正したのではないでしょうか。その恩恵を受けられる方がよいのではないでしょうか。それが問題であればGNU Readline本体を修正してもらう方がよいと思います。

以上です。
よろしくお願いします。

On 2011/04/29, at 22:37, Nobuhiro IMAI wrote:

いまいです。

GNU readline library での話ですが、6 系のものを使うと TAB キーでの補完
後に Readline.completion_append_character がデフォルトの " " に戻ってし
まいます。しかも、" " 以外にセットしても、補完された単語にはデフォルト
の " " が付加されます。

require "readline"

p RUBY_DESCRIPTION
p Readline::VERSION
p Readline.completion_append_character
Readline.completion_proc
=end

Updated by no6v (Nobuhiro IMAI) over 13 years ago

=begin
いまいです。

From: Takao Kouji <kouji_at_takao7.net>
Date: Sat, 30 Apr 2011 13:35:51 +0900

高尾です。

GNU readline library での話ですが、6 系のものを使うと TAB キーでの補完
後に Readline.completion_append_character がデフォルトの " " に戻ってし
まいます。しかも、" " 以外にセットしても、補完された単語にはデフォルト
の " " が付加されます。
(省略)
changelog に以下のように書いてあって、補完後にリセットされるのは意図的
なようです。Ruby の readline 側で何とかならないものでしょうか?

上記に関して確認させてください。

Readlineについて、いまいさんから2つの相談があったと認識しています。

はい。

1)GNU Readline 6の場合にReadline.completion_append_characterにnilを指定できない不具合がある

nilをセットしても補完後にスペースが追加される問題ですね。
こちらは原因を調査して対応したほうがよいと考えています。

そうですね。セットできないというか、セットしても効果が得られないと言う
感じです。nil に限らず、何をセットしても一度補完してしまうとデフォル
ト値にリセットされてしまいます。

2)GNU Readline 6の場合でも5以前と同様の動作にしてほしい

GNU Readline 6では、補完後にReadline.completion_append_characterがデ
フォルト値へリセットされるので、5以前と同様にリセットされないように
してほしいことで間違いないでしょうか。こちらについては、私はGNU
Readlineでそのような挙動なのであればそれに従ったほうがよいと思ってい
ます。GNU Readline本体では、何かしらの理由があってその方がよいと考え
て修正したのではないでしょうか。その恩恵を受けられる方がよいのではな
いでしょうか。それが問題であればGNU Readline本体を修正してもらう方が
よいと思います。

推測ですが、changelog を読む限り、GNU readline を利用するアプリケーショ
ン側で rl_completion_append_character を変更すると、ライブラリ側で何か
問題が生じるので、補完する度にリセットするようになったのだと認識してい
ます。必要に応じて、補完する関数(rl_attempted_completion_function か
な?)を呼び出す度にアプリケーション側で rl_completion_append_character
をセットしてね、ということなんじゃないでしょうか。

影響範囲がよく分かっていませんが、Ruby の readline 側で
rl_completion_append_character 相当のものを保持しておいて、補完する時
にセットしてやればいいのではないでしょうか?

やってみたら何か動いてそう、というレベルのものですが、参考までにパッチ
を付けてみます。Ruby のスクリプトから readline.so を使う限りはこれでよ
さそうですが、拡張ライブラリから直接 rl_completion_append_character を
いじるようなことがある(のかどうかは分かってません)と破綻しちゃいそうです。

Nobuhiro IMAI
Key fingerprint = E57F 2482 4074 13BC 3B9A 165B C689 5B16 A620 4657

=end

Updated by nobu (Nobuyoshi Nakada) about 13 years ago

なかだです。

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

Updated by no6v (Nobuhiro IMAI) about 13 years ago

いまいです。

From: Nobuyoshi Nakada <nobu_at_ruby-lang.org>
Date: Wed, 21 Dec 2011 17:06:48 +0900

もうちょっとシンプルに、readline()呼び出し前に保存しておいて補完すると
きにはそれを使うというのはどうでしょうか。readline()呼び出しの最中に他
のスレッドから変更しても上書きされてしまいますが、元々マルチスレッドで
動かせるものでもないと思います。

なるほど。ありがとうございます。r34098 に当ててみて、うまく動くのを確
認しました。個人的な用途としてはこれで十分だと思うので、取り込んでもら
えるとうれしいです。

Nobuhiro IMAI
Key fingerprint = E57F 2482 4074 13BC 3B9A 165B C689 5B16 A620 4657

Updated by kouji (Kouji Takao) about 13 years ago

高尾です。

On 2011/12/22, at 22:52, Nobuhiro IMAI wrote:

From: Nobuyoshi Nakada <nobu_at_ruby-lang.org>
Date: Wed, 21 Dec 2011 17:06:48 +0900

もうちょっとシンプルに、readline()呼び出し前に保存しておいて補完すると
きにはそれを使うというのはどうでしょうか。readline()呼び出しの最中に他
のスレッドから変更しても上書きされてしまいますが、元々マルチスレッドで
動かせるものでもないと思います。

なるほど。ありがとうございます。r34098 に当ててみて、うまく動くのを確
認しました。個人的な用途としてはこれで十分だと思うので、取り込んでもら
えるとうれしいです。

近況報告だけで申し訳ないのですが、
遅くなりましたが、取り込む方向で動いています。
もう少しお待ちくださいませ。


TAKAO Kouji
blog: http://d.hatena.ne.jp/kouji0625/
twitter: takaokouji / projects: ruby, s7-seven

Actions #8

Updated by kouji (Kouji Takao) about 13 years ago

  • Status changed from Assigned to Closed
  • % Done changed from 0 to 100

This issue was solved with changeset r34109.
Nobuhiro, thank you for reporting this issue.
Your contribution to Ruby is greatly appreciated.
May Ruby be with you.


  • ext/readline/readline.c (readline_attempted_completion_function):
    in Readline module with GNU Readline 6 case, Readline module
    resets completion_append_character to " ", after it executes
    completion. So, Readline module stores
    completion_append_character, and Readline module always sets it
    after Readline module executes completion. [ruby-dev:43456]
    [Feature #4635]
Actions #9

Updated by kouji (Kouji Takao) about 13 years ago

  • Tracker changed from Feature to Backport
  • Project changed from Ruby master to Backport193
  • Category deleted (ext)
  • Status changed from Closed to Open
  • Assignee deleted (kouji (Kouji Takao))

Please backport r34109 to ruby_1_9_3

Actions #10

Updated by naruse (Yui NARUSE) almost 13 years ago

  • Status changed from Open to Closed

This issue was solved with changeset r34471.
Nobuhiro, thank you for reporting this issue.
Your contribution to Ruby is greatly appreciated.
May Ruby be with you.


merge revision(s) 34109:

* ext/readline/readline.c (readline_attempted_completion_function):
  in Readline module with GNU Readline 6 case, Readline module
  resets completion_append_character to " ", after it executes
  completion. So, Readline module stores
  completion_append_character, and Readline module always sets it
  after Readline module executes completion. [ruby-dev:43456]
  [Feature #4635]
Actions

Also available in: Atom PDF

Like0
Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0