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))) )))