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

From: kohno kazuyuki <kkohno@...>
Date: 2009-03-17 11:55:54 UTC
List: ruby-list #45927
河野(jugyo)です

報告です。

MUSHA さんにご提案いただいた方法を参考にしてプログラムを修正したところ、
うまくいきました!!
MUSHA さんありがとうございます!

ていうか、'dl/import' ってすごいですね。
こんな機能があるなんて知りませんでした。


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


2009/3/17 kohno kazuyuki <kkohno@gmail.com>:
> 河野(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 <knu@idaemons.org>:
>> 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