[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[dennou-ruby:000395] Re: improved NumArray



ごとけんです

ただいまバイトから帰って来ました。

In message "[dennou-ruby:000394] Re: improved NumArray"
    on 00/09/07, Masato Shiotani <shiotani@xxxxxx> writes:
>まず readline をインストールして, ruby を make し直したらいいというこ
>となんでしょうか, それとも ruby に readline のライブラリがついていると
>か?

そうです。
ftp://ftp.eos.hokudai.ac.jp/pub/GNU/gnu.org/readline/readline-4.1.tar.gz


In message "[dennou-ruby:000393] Re: improved NumArray"
    on 00/09/07, Takeshi Horinouchi <horinout@xxxxxx> writes:
>ところで、さらに history と打ち込むと過去数10件の一覧が出るとか、
>必要に応じて打ち込んだものの log がとれたりしないかなと思うので
>すが、そんな機能知りません? > ごとけんさん

書いてみた雛型を送りますね。Readline::completion_proc はコマ
ンドライン補完のためのProcで、これを設定しておくとbashのよう
なコマンドラインが使えます。Readline::HISTORY は配列もどきで
す。もどきなので、配列にするには to_a を使う必要があります。
Readlineの他の機能は
http://www.math.sci.hokudai.ac.jp/~gotoken/ruby/r/readline.shtml

のUSAGEを見て下さい。INSTALLATIONの項目はreadlineが標準配布
でなかった頃の話なので無視して下さいまし。

#!/usr/bin/env ruby
require "readline"

class Frontend
  include Readline
  Me = File.basename($0)
  Prompt  = "#{Me}> "
  History = true
  Command = {}
  Readline::completion_proc =
    lambda{|s| Command.keys.find_all{|elm| elm =~ s}}

  def start
    catch(:exit) {
      while line = readline(Prompt, History)
	next if /^\s*$/ =~ line
	argv0, *argv = line.split
	job = Command[argv0]
	if job
	  job.call(argv)
	else
	  puts "#{Me}: #{argv0}: no such command"
	end
      end
      print "\n"
    }
  end

  def define_command(*name, &job)
    name.each do |n|
      Command[n] = job
    end
  end

  def initialize
    define_command("history") do |*max|
      max = (max[0]||10).to_i
      s = Readline::HISTORY.size
      (s-1).downto([0, s-max].max){|i|
	puts HISTORY[i]
      }
    end

    define_command("exit", "quit", "bye") do
      throw(:exit)
    end
  end
end

if __FILE__ == $0
  f = Frontend.new
  f.define_command("date") do puts Time.now end
  f.start
end