Project

General

Profile

Backport #4635

Readline.completion_append_character

Added by no6v (Nobuhiro IMAI) almost 8 years ago. Updated about 7 years ago.

Status:
Closed
Priority:
Normal
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 nov@yo.rim.or.jp
Key fingerprint = E57F 2482 4074 13BC 3B9A 165B C689 5B16 A620 4657
=end


Related issues

Related to Ruby trunk - Feature #1823: Readline Command CompletionRejected07/28/2009Actions

Associated revisions

Revision 5191ecad
Added by kouji (Kouji Takao) about 7 years ago

  • 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]

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@34109 b2dd03c8-39d4-4d8f-98ff-823fe69b080e

Revision 34109
Added by kouji (Kouji Takao) about 7 years ago

  • 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]

Revision 34109
Added by kouji (Kouji Takao) about 7 years ago

  • 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]

Revision 34109
Added by kouji (Kouji Takao) about 7 years ago

  • 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]

Revision 34109
Added by kouji (Kouji Takao) about 7 years ago

  • 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]

Revision 34109
Added by kouji (Kouji Takao) about 7 years ago

  • 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]

Revision 34109
Added by kouji (Kouji Takao) about 7 years ago

  • 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]

Revision e1dabb0f
Added by naruse (Yui NARUSE) about 7 years ago

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]

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_1_9_3@34471 b2dd03c8-39d4-4d8f-98ff-823fe69b080e

Revision 34471
Added by naruse (Yui NARUSE) about 7 years ago

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]

History

Updated by naruse (Yui NARUSE) almost 8 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) almost 8 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) almost 8 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) almost 8 years ago

=begin
いまいです。

From: Takao Kouji
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 nov@yo.rim.or.jp
Key fingerprint = E57F 2482 4074 13BC 3B9A 165B C689 5B16 A620 4657

=end

Updated by nobu (Nobuyoshi Nakada) about 7 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 7 years ago

いまいです。

From: Nobuyoshi Nakada
Date: Wed, 21 Dec 2011 17:06:48 +0900

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

なるほど。ありがとうございます。r34098 に当ててみて、うまく動くのを確
認しました。個人的な用途としてはこれで十分だと思うので、取り込んでもら
えるとうれしいです。
--
Nobuhiro IMAI nov@yo.rim.or.jp
Key fingerprint = E57F 2482 4074 13BC 3B9A 165B C689 5B16 A620 4657

Updated by kouji (Kouji Takao) about 7 years ago

高尾です。

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

From: Nobuyoshi Nakada
Date: Wed, 21 Dec 2011 17:06:48 +0900

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

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

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


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

#8

Updated by kouji (Kouji Takao) about 7 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]
#9

Updated by kouji (Kouji Takao) about 7 years ago

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

Please backport r34109 to ruby_1_9_3

#10

Updated by naruse (Yui NARUSE) about 7 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]

Also available in: Atom PDF