emacsからirbを使う

Emacs上から run-ruby して、irbを使ってる。

C-jでshellコマンドを実行したりする様にして、shellみたいな使い方をしてる。
irb-shell や rush も面白そうだと思うけど、フツーのirbの機能+shell機能だけあれば良いんで。

で、プロンプトにカレントディレクトリを表示させる為に、下記みたいな .irbrc を使っている。頭悪そう。

もっと効率の良い方法無いかなー。

module IRB
  class Irb
    def prompt(prompt, ltype, indent, line_no)
      p = prompt.dup
      p.gsub!(/%([0-9]+)?([a-zA-Z])/) do
        case $2
        when "N"
          @context.irb_name
        when "m"
          @context.main.to_s
        when "M"
          @context.main.inspect
        when "l"
          ltype
        when "i"
          if $1 
            format("%" + $1 + "d", indent)
          else
            indent.to_s
          end
        when "n"
          if $1 
            format("%" + $1 + "d", line_no)
          else
            line_no.to_s
          end
        when "W"
          $_pwd_
        when "%"
          "%"
        end
      end
      p
    end
  end
end
$_pwd_ = Dir.pwd
IRB.conf[:PROMPT][:MY_PROMPT] = { # プロンプトモードの名前
:PROMPT_I => "%N(%W):%03n:%i> ",  # 通常のプロンプト
#  :PROMPT_S => nil,              # 文字列などの継続行のプロンプト
#  :PROMPT_C => nil,              # 式が継続している時のプロンプト
:RETURN => "R:%s\n"             # リターン時のプロンプト
}
IRB.conf[:PROMPT_MODE] = :MY_PROMPT
# rubygems, Clipboard.set_data が使える様にデフォルトでrequireしといてやる。 
require 'rubygems'
require 'win32/clipboard'
include Win32

.emacsの方はこんな↓感じ。

(add-hook 'inferior-ruby-mode-hook
          '(lambda ()
			 (define-key inferior-ruby-mode-map "\C-j" 'ara-irb-shexec)))
(defun ara-shstr-to-rbstr (str)
  "shell command 文字列をrubyコマンド風に変換する"
  (concat "system %q(" str ")\n"))
(defun ara-irb-cd (dir)
  "与えられたディレクトリにEmacs的に移動し、irb内部のカレントディレクトリも変更する"
  (interactive "fDir: ")
  (setq dir (expand-file-name dir))
  (cd dir)
  (comint-send-string (ruby-proc) (concat "Dir.chdir %q(" dir ");$_pwd_=%q(" dir ")\n"))
)
(defun ara-irb-shexec (&optional cmd)
  "current line の文字列をshellコマンドとして実行する"
  (interactive)
  (let (end newcmd)
    (save-excursion
	  (end-of-line)
	  (setq end (point))
	  (beginning-of-line)
	  (setq cmd (buffer-substring (point) end))
	  (delete-region (point) end)
	  (if (string-match "^cd " cmd)
		  (ara-irb-cd (substring cmd 3))
		(comint-send-string (ruby-proc) (ara-shstr-to-rbstr cmd)))
)))