From: kohno kazuyuki Date: 2009-03-17T20:17:36+09:00 Subject: [ruby-list:45926] Re: Ruby のReadline から redraw-current-line を呼び出すことは可能でしょうか? 河野(jugyo)です >  とりあえずUnix系OSとRuby 1.8系を仮定すると以下で動くと思います。 > FreeBSD, Mac OS X, Linuxでは行けましたが、libeditしかない環境や > 他のOSではわかりません。DL2 (ruby 1.9)では動きません。 おおお!! まさに求めていた答えかもしれません! 試してみます! # jugyo.org@gmail.com # http://jugyo.org/ # http://github.com/jugyo 2009/3/17 Akinori MUSHA : > At Tue, 17 Mar 2009 13:15:54 +0900, > Takao Kouji wrote: >> On 2009/03/17, at 12:08, kohno kazuyuki wrote: >> > GNU Readline には「redraw-current-line」という機能があって、これを呼び出すとカレント行を再表示させることができます。 >> > この機能を Ruby の Readline から呼び出すことは可能でしょうか? >> >> RubyのReadlineではできないと思います。 > >  GNU Readline のソースを見ると redraw-current-line の実体は > rl_refresh_line() のようなので、メソッドを追加してあげるのはどう > でしょうか。 > > 何を追加して何を追加しないというポリシーの問題かもしれませんが。 > >> > もしくは「redraw-current-line」と同じような機能を Ruby 側で頑張って実装することは可能でしょうか? >> >> これはRuby 1.8.7のようにリリース済みのRubyを使って、 >> 「redraw-current-line」を実装できないかというご質問ですよね。 >> その方法はわかりませんね。 > >  とりあえずUnix系OSとRuby 1.8系を仮定すると以下で動くと思います。 > FreeBSD, Mac OS X, Linuxでは行けましたが、libeditしかない環境や > 他のOSではわかりません。DL2 (ruby 1.9)では動きません。 > > require 'readline' > require 'dl/import' > > module Readline > module LIBREADLINE > extend DL::Importable > dlload 'libreadline.so' # Mac OS Xは .dylib > extern 'int rl_refresh_line(int, int)' > end > > def self.refresh_line > LIBREADLINE.rl_refresh_line(0, 0) > end > end > > # 以下テスト > > Thread.start { > STDOUT.sync = 1 > print 'aaa' > sleep 1 > print 'bbb' > sleep 1 > print 'ccc' > Readline.refresh_line > } > > while buf = Readline.readline('> ', true) > puts '=> ' + buf > end > > > -- > Akinori MUSHA / http://akinori.org/ >