[#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:45925] Re: Ruby の Readline から redraw-current-line を呼び出すことは可能でしょうか?

From: "Akinori MUSHA" <knu@...>
Date: 2009-03-17 11:02:50 UTC
List: ruby-list #45925
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/

In This Thread