From: Akinori MUSHA Date: 2009-03-17T20:02:50+09:00 Subject: [ruby-list:45925] Re: Ruby の Readline から redraw-current-line を呼び出すことは可能でしょうか? --pgp-sign-Multipart_Tue_Mar_17_20:05:09_2009-1 Content-Type: text/plain; charset=ISO-2022-JP 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/ --pgp-sign-Multipart_Tue_Mar_17_20:05:09_2009-1 Content-Type: application/pgp-signature Content-Transfer-Encoding: 7bit -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.9 (FreeBSD) iEYEABECAAYFAkm/g+YACgkQkgvvx5/Z4e78/gCfYDKoB3d89qfYg9IqOu0TGj98 I3MAoNw5hGrHCFU5JXg4us9ql4gwiBNa =MSLD -----END PGP SIGNATURE----- --pgp-sign-Multipart_Tue_Mar_17_20:05:09_2009-1--