.irbrcの設定メモ

2011/6/6 16:20更新

一部多分動くだろう、使うかもしれんと適当にやってるのでコピーしても動く保証はいたしません。

active_support入れると色々便利なメソッド追加されるけど、
どこまでがRuby本来のメソッドか分からなくなるのと、
立ち上がりがちょっと遅くなるので初期化では私は入れません。
String#constantizeとか、標準であったようなとかいろんな勘違いを防ぐためにも・・・。


面倒でも必要に応じて、
irb立ち上げ後にrequire "active_support"する。

#! ruby -Ks
$KCODE = 'sjis'
require 'irb/completion'
require 'pp'
require 'kconv'
require 'rubygems'
require 'benchmark'
require 'readline' #※1 別記事参考

#require 'win32console'
#require 'wirble'
#Wirble.init
#Wirble.colorize

IRB.conf[:SAVE_HISTORY] = 30
  
  #linuxっぽくpwdで現在ディレクトリを表示する
  def pwd
    Dir.pwd
  end
  
  #linuxっぽくlsで現在ディレクトリ(または引数ディレクトリ)のファイルを表示する
  def ls(dir = Dir.pwd)
    #files =  Dir.entries(dir)
    #p files.join(' ')
    system(%Q(dir  "#{dir}" /W))
  end
  
  #linuxっぽくllで現在ディレクトリ(または引数ディレクトリ)のファイルを表示する
  def ll(dir = Dir.pwd)
    files =  Dir.entries(dir)
    puts files
  end
  
  #linuxっぽくchでディレクトリを移動する
  #厳密にやるなら移動先がディレクトリかも確認したほうがいいかも
  def cd(dir = Dir.pwd)
    Dir.chdir(dir)
    files = Dir.entries(pwd)
    puts "[directory]"
    puts pwd
    return pwd
  end
  
  
  #$_が覚えられそうにないので、最後にgetsかreadlineで得た内容を表示する
  def last_gets
    return $_
  end
  alias last_readline last_gets
  
  #load_pathの表示をする
  def load_path(sort = false)
    sort ? $LOAD_PATH.sort : $LOAD_PATH
  end
  alias lpath load_path
  
  #requireしてるものを表示する
  def requires(sort = false)
    sort ? $LOADED_FEATURES.sort : $LOADED_FEATURES
  end

  #Windows用。 コンソール表示時にsjisに変換する
  def puts(*arg)
    if arg.empty?
      str = ""
    else
      str = arg
    end
    arg.is_a?(String) ? str.to_s.tosjis : super(str)
  end

  #Windows用。 コンソール表示時にsjisに変換する
  def print(*arg)
    if arg.empty?
      str = ""
    else
      str = arg
    end
    arg.is_a?(String) ? str.to_s.tosjis : super(str)
  end

  #テスト用。
  #Symbol、String、Fixnum、Float、Range、Array、Hashのインスタンスを幾つか作成する
  #スコープの関係でインスタンス変数で作成。
  #これを呼ぶだけだと作成した変数がわかりにくいのでself.instance_valiablesをreturnで返す
  def test_var
    #Symbol
    @sym1 = :sym
    @sym2 = :key
    @sym3 = :def
  
    #Strng
    @hoge = "hogehoge"
    @fuga = "fuga"
    @s1 = "String instance"
    @s2 = "Not heart mark"
    @s3 = "マルチバイト文字列"
  
    #Fixnum
    @a = 12345
    @b = 11111
  
    #Float
    @f1 = 1.4
    @f2 = 1.6
    @f3 = 10.55
    @f4 = 0.33
  
    #Range
    @range = (1..100)
  
    #Array
    @arr1 = [1,nil,"a",:b]
    @arr2 = @range.to_a
  
    #Hash
    @h = {:k1 => "v1", :k2 => "v2", "ks3" => "v3", "ks4" => "v4", 5 => 5, 6 => 6, nil => 10000}
  
    return self.instance_variables.sort
  end
  

  #ファイルの中身表示(DOSコマンド利用)
  def cat(file_name)
    system(%Q(type "#{file_name}"))
  end

  #ファイルの中身を1画面ごとに表示(DOSコマンド利用)
  def more(file_name)
    puts "*"*100
    puts("【moreコマンドについてメモ】")
    puts("[Q]     終了")
    puts("[space] 次ページ")
    puts("その他  ggrks")
    puts "*"*100
    puts
    system(%Q(more "#{file_name}"))
  end

  #コンソールクリア(DOSコマンド利用)
  def cls
    system("cls")
  end
  alias clear_console cls

  #ファイルコピー(DOSコマンド利用)
  def cp(file_name, copy_file_path)
    system(%Q(copy "#{file_name}" "#{copy_file_path}"))
  end

  #ディレクトリ階層ごとコピー
  def cp_dir(dir_name, copy_dir_path)
    system(%Q(xcopy "#{dir_name}" "#{copy_dir_path}" /s /e))
  end

  #ファイル移動
  def fmove(file_name, move_path)
    system(%Q(move "#{file_name}" "#{move_path}"))
  end

  #カレントディレクトリにファイル移動(ファイル取得)
  def fget(file_name)
    system(%Q(move "#{file_name}" . ))
  end

  #ファイルリネーム(DOSコマンド利用)
  def frename(old_file_name, new_file_name)
    system(%Q(rename "#{old_file_name}" "#{new_file_name}"))
  end

  #ファイル削除(DOSコマンド利用)
  def fdelete(file_name)
    system(%Q(del "#{file_name}"))
  end
  alias fremove fdelete

  #指定したディレクトリの階層構造をツリー形式で表示する
  def tree(dir_name = pwd, file_output = false)
    if file_output
      system(%Q(tree "#{dir_name}" /a))
    else
      system(%Q(tree "#{dir_name}" /a /f))
    end
  end

  #ディレクトリ作成(DOSコマンド利用)
  #怖いのでディレクトリ階層丸ごと消すdeltreeは用意しない。
  def mkdir(dir_name)
    system(%Q(mkdir "#{dir_name}"))
  end

  #EmEditorでファイルを開く(環境変数のPATHを通す必要あり)
  def emeditor(file_name)
    system(%Q(emeditor "#{file_name}"))
  end

  #メモ帳でファイルを開く
  def notepad(file_name)
    system(%Q(notepad "#{file_name}"))
  end

  #ファイル開く(ダブルクリック実行と同じ)
  def fopen(file_name)
    system(%Q(open "#{file_name}"))
  end

  #簡易ベンチマーク測定
  #bench(親times回数, 実際に実行する子times回数){ 実行処理 }
  #bench{ 実行処理 }でOK
  def bench(bench_count = 5, exe_count = 10000)
    puts Benchmark::CAPTION
    bench_count.times do
      puts Benchmark.measure {
       exe_count.times { yield }
      }
    end
  end

  #区切り線を出すための文字列を返す。 puts hrとかで利用
  def hr(count = 80, str = "-", between_blank = true)
    hr_str = ""
    hr_str << "\n" if between_blank
    hr_str << str.to_s * count
    hr_str << "\n\n" if between_blank
  end

  #特定行数の空行を入れる
  def blank_line(line_count = 1)
    line_count.times{ puts }
  end

  #irbで現在のself・self.classや、そのクラスに定義されている変数・定数などの情報を出す
  def self_info
    #実行するメソッド表示
    def info_title_output(call_method)
      puts "*** #{call_method} ***"
    end

    #メソッド実行、結果表示
    def result_output(call_method)
      print "#=> "
      p eval(call_method)
    end

    @self_class = self.is_a?(Class) ? self : self.class

    #call_methods
    #ここでlocal_variables.sortすると、メソッド内スコープでのローカル変数になるので入れない
    %w(self
       self.class
       @self_class.ancestors 
       requires
       @self_class.included_modules
       @self_class.constants.sort
       @self_class.class_variables.sort
       self.instance_variables.sort
    ).each do |call_method|
      info_title_output(call_method)
      result_output(call_method)
      blank_line(2)
    end

    #スコープ違う、irb起動後のmainスコープの中のローカル変数を表示したいけれど
    #それには無理がありそうなので、
    #"local_variables"って文字列を返して、
    #eval(self_info)とすればmainスコープのローカル変数も最後に表示するようにした。
    #あんまりスマートじゃないけど('・ω・`)

    #return nil
    return "local_variables.sort"
  end

  #methods.grep.sortの略でmgで定義
  #[].mg(/^o/)とかで走るようにする。
  class Object
    def mg(grep_rege = //)
      pp self.methods.grep(grep_rege).sort
    end
  end

  #10回くらいRand発生させてばらつきを見るだけ
  #optionは
  #:seed      srand(seed)を与える場合。基本は数字。文字列は文字コードの数字として与える。数値・文字以外だとsrand使わない
  #:count     何回表示させるか(デフォルト10回)
  #:sleep_time  1回の表示に何秒間隔を空けるか(デフォルト0.6秒)
  def rand_test(rand_arg = nil, options = {})
    seed = options.has_key?(:seed) ? options[:seed] : nil
    count = options.has_key?(:count) ? options[:count].to_i : 10
    sleep_time = options.has_key?(:sleep_time) ? options[:sleep_time].to_f : 0.6

    if seed.is_a?(Fixnum) || seed.is_a?(String)
      if seed.class == Fixnum
        srand(seed)
      else        
        #文字コードの数字を連結してseedに与える
        srand(seed.split(//).map{|str| str[0]}.join.to_i)

        #injectで文字コードの数字合計をseedに与える場合
        #srand(seed.split(//).map{|str| str[0]}.inject(0){|sum,x| sum + x})
      end
    else
      seed = nil
    end

    count.times do
      p rand(rand_arg)
      sleep(sleep_time)
    end
  end


自分のirb設定。

※1
そのままコピーすると、おそらくこの部分↓
require 'readline'
でエラー(LoadError)がでると思います。
こちらにつきましては
irbの長い文字列入力時、backspace等でのバグ対処法」
http://d.hatena.ne.jp/fre_oik/20110606/1307336153
と、別途記事にして書いてあります。
Windowsコマンドプロンプトirbを動作させた場合(のみ?)の怪しい挙動の対処です。


その他について。

WindowsコマンドプロンプトだとUTF8等設定を変えないと、
ShiftJIS以外のマルチバイト文字が文字化けしちゃう。
UTF-8の対応が若干面倒なのと、参考記事を幾つか見ながらやって自分がうまく出来なかったので、ダサいと言われようとShiftJISで対応することにしている。

ので、
#! ruby -Ks
$KCODDE
でShiftJISの表示対応。

あとはlinuxっぽく使えるように、
pwd, ls, ll, cdを定義。

$_なんて覚えらんねーよと半ば逆ギレ気味に、
last_getsとlast_readlineを定義。

$LOAD_PATHもたまに忘れるから、
load_pathで呼べるようにしておく。

$LOADED_FEATURESなんてものをさっき知ったので、
requiresで呼べるようにしておく。

後は自分のテスト用にいろいろ変数を初期化するための
test_variableを用意している。


更新した分は追記しない!