[#45922] Ruby の Readline から redraw-current-line を呼び出すことは可能でしょうか? — kohno kazuyuki <kkohno@...>

こんにちは

14 messages 2009/03/17
[#45923] Re: Ruby の Readline から redraw-current-line を呼び出すことは可能でしょうか? — Takao Kouji <kouji@...7.net> 2009/03/17

高尾宏治です。

[#45925] Re: Ruby の Readline から redraw-current-line を呼び出すことは可能でしょうか? — "Akinori MUSHA" <knu@...> 2009/03/17

At Tue, 17 Mar 2009 13:15:54 +0900,

[ruby-list:45924] Re: Ruby の Readline から redraw-current-line を呼び出すことは可能でしょうか?

From: kohno kazuyuki <kkohno@...>
Date: 2009-03-17 04:58:02 UTC
List: ruby-list #45924
河野(jugyo)です。

高尾さんレスありがとうございます。

> RubyのReadlineではできないと思います。

やはりできませんか。。

> また、河野(jugyo)さんの用途をおしえていただけると、
> 何かよいアイデアが思いつくかもしれません。

そうですね。何がしたいのかということですよね。
Termtter というコンソールベースの Twitter クライアントを作っていまして、その中で ruby の readline を使っています。
Termtter の基本動作ですが、以下のような感じになります。

  (1) 一定間隔でデータを取得し、コンソールに出力
  (2) コンソールからコマンドを実行してメッセージを投稿

(1)と(2)がそれぞれ別のスレッドで動いています。
で、問題になるのがメッセージを投稿しようとしている時に(1)が動作するケースで、
そうなるとコンソールに Twitter ユーザーの発言が出力されて入力中の文字が流れてしまいます。
今は .inputrc に高尾さんがおっしゃられているような設定を書いて、
キー入力によって入力中の文字列をカレント行に復活させるようにしています。
できればこの「入力中の文字列をカレント行に復活させる」処理をプログラム内で自動で行いたいのです。

サンプルコードを書いてみました。Termtter はこんな感じの動作をします。

# ----------------------------------
require 'readline'

Thread.new do
  loop do
    sleep 5
    puts 'jugyo: 帰宅ったー'
    # ここで入力中の文字を復活させたい!
  end
end

while buf = Readline.readline('> ')
  puts '=> ' + buf
end
# ----------------------------------

何か良いアイデアを思いついた方がいましたらお返事ください。

# jugyo.org@gmail.com
# http://jugyo.org/
# http://github.com/jugyo


2009/3/17 Takao Kouji <kouji@takao7.net>:
> 高尾宏治です。
>
> On 2009/03/17, at 12:08, kohno kazuyuki wrote:
>> GNU Readline には「redraw-current-line」という機能があって、これを呼び出すとカレント行を再表示させることができます。
>> この機能を Ruby の Readline から呼び出すことは可能でしょうか?
>
> RubyのReadlineではできないと思います。
>
>> もしくは「redraw-current-line」と同じような機能を Ruby 側で頑張って実装することは可能でしょうか?
>
> これはRuby 1.8.7のようにリリース済みのRubyを使って、
> 「redraw-current-line」を実装できないかというご質問ですよね。
> その方法はわかりませんね。
>
> 考えられる方法としては、GNU Readlineの設定をするというのはどうでしょうか。
> 例えば、~/.inputrcに次の設定を行います。すると、
> Ctrl+xのあとにrを押すと、redraw-current-lineが実行されます。
>
> $if Ruby
> "\C-xr": redraw-current-line
> $endif
>
> また、河野(jugyo)さんの用途をおしえていただけると、
> 何かよいアイデアが思いつくかもしれません。
>
> ---
> TAKAO Kouji <kouji@takao7.net>
> blog: http://d.hatena.ne.jp/kouji0625/
> twitter: takaokouji / projects: ruby, s7-seven
>
>
>
>
>

In This Thread