[Ruby] ruby-modeが使いにくいので改造
Ruby を学び始めたのだが、ruby-modeがonelinerを評価してくれない様子。
評価系のキーバインドを見てみると、block用、region用、definition用の3種類が有る様子。
C-c C-b ruby-send-block C-c C-r ruby-send-region C-c C-x ruby-send-definition C-c M-b ruby-send-block-and-go C-c M-r ruby-send-region-and-go C-c M-x ruby-send-definition-and-go
onelinerを評価してくれないのは使いずらい。
関数を定義したら、それを試すためにテスト式を一行書いて試してみたくなるのがプログラマの人情というもの。
irbに移動して関数名をタイプするのも手だが、スマートではない。
lisp-interaction-modeでs式を評価するように、C-x C-e で評価できないものか、と見よう見まねで試行錯誤をしてみたらできちゃったよ。
以下がその結果。
(10/10 追記: ここに新しいバージョンが有って、oneliner だけではなくブロックもC-x C-eで評価できるようになっています。)
(10/12 追記: ここにはもっと新しいバージョンが有って、endの自動補完機能まで付けちゃいました。)
;; ruby-mode customize (defun ruby-send-oneliner () "Send a line to the inferior Ruby process. Cursol must be at the end of the line of the oneliner" (interactive) (let *1 (defun scroll-down-irb () (interactive) (setq curbuf (current-buffer)) (if (get-buffer ruby-buffer) (pop-to-buffer ruby-buffer) (error "No current process buffer. See variable ruby-buffer.")) (end-of-buffer) (pop-to-buffer curbuf)) (add-hook 'ruby-mode-hook '(lambda () (define-key ruby-mode-map "\C-x\C-e" 'ruby-send-oneliner)))
使い方は、これを.emacs などに登録するだけ。後は、評価したい式の一番後ろにカーソルを移動してC-x C-eだ。
元々C-x C-eはelispの評価にバインドされていたのだが、ruby-modeではこれを使わないので、上書きする事にした。
それからついでにirbのwindowからスクロールアウトしてしまう評価結果をscroll-down-irbでスクロールダウンして常にwindowの一番下に表示されるようにした。っていうか、なんでそもそも ruby-send-region, ruby-send-block, ruby-send-definitionはスクロールダウンする仕様になってないんだ!?
Programming in Emacs Lisp: Programming in Emacs Lispでelispの使い方を学んだ直後で、初めて作った実用的なelispだっただけに、超嬉しい!!
emacs使ってみなくちゃなーと尻込みしていたその半年後の初めての成果だ。
ruby-modeのキーバインドの解説が短か過ぎて、irbに送られるblock, definition の定義も良くわからなかったのだが、自然とruby-modeのソースコード開いて読んでいる自分がいてビックリした。
Programming in Emacs Lisp: Programming in Emacs Lisp、読んでおくと良いよ。お奨め。