Techioz Blog

IRB プロンプトを動的に変更するように構成することはできますか?

概要

IRB でファイル システム内を移動し、現在の作業ディレクトリを反映するようにプロンプトを変更したいのですが、各コマンドの後にプロンプトを更新する方法がわかりません。最終的には、日常業務で IRB をもっと使用して、bash を廃止したいと考えています。私は.irbrcでこれを試しました:

require 'fileutils'
include FileUtils

IRB.conf[:PROMPT][:CUSTOM] = {
    :PROMPT_N => "\e[1m:\e[m ",
    :PROMPT_I => "\e[1m#{pwd} >\e[m ",
    :PROMPT_S => "FOO",
    :PROMPT_C => "\e[1m#{pwd} >\e[m ",
    :RETURN => ""
}
IRB.conf[:PROMPT_MODE] = :CUSTOM

ただし、IRB プロンプトは更新されません。

julianmann@mango:~ > irb
/users/julianmann > puts pwd
/users/julianmann
/users/julianmann > cd 'dev'
/users/julianmann > puts pwd
/users/julianmann/dev
/users/julianmann > 

プロンプトを変更してほしいです。

解決策

作業ディレクトリを取得するための簡単なハックを次に示します。やや脆弱ですが、Ruby 1.8.7 と 1.9.2 では動作しました。

プロンプト文字列を次のように設定します。

"%N(%m):%03n:%i %~> ".tap {|s| def s.dup; gsub('%~', Dir.pwd); end }

「%~」ディレクティブは irb 自体では理解されないため、それを使用して置換を行いました。このハッキングは、irb が dup を呼び出してプロンプトを生成するという事実に依存しています。