Ruby の勉強はじめてます

どもども。

Ruby の勉強初めてみました。
んで,便利な環境にするべくいくつか手を施したので,
そのメモ。

shell-mode のバッファで現在編集中の ruby ファイルを実行

以下の関数を,

(define-key ruby-mode-map (kbd "\C-c\C-e") 'my-ruby-mode-execute-in-shell-buffer)

で,Ctrl-cCtrl-e に割り当てました。
便利すぐる。
ちなみに自分で手を入れている shell-pop.el を使っています。
C-cC-e でシェルバッファに飛んで,実行なりしたら,shell-pop に割り当てている
キー(ワタシはF8とC-zC-z)でもとのバッファに戻ります。


※追記
シェルバッファのカレントディレクトリが.rbファイルの場所と異なる場合には,
実行できないという罠が見つかりました。
なので使わない方がいいかもです。ワタシは使うけど。

(defun my-ruby-mode-execute-in-shell-buffer ()
  (interactive)
  (let* ((filename (buffer-name))
         (cmd (format "ruby -cw %s && ruby -w %s" filename filename)))
    ;; first switch to shell-mode buffer
    (shell-pop)
    ;; move to the end of the buffer
    (goto-char (point-max))
    ;; insert compilation command
    (insert cmd)))

スクリプトファイルとそのテストファイルとの行き来

そのまま。

(defun my-ruby-mode-find-test-buffer ()
  "Switch buffers between some.rb and test_some.rb if such a
buffer exists."
  (interactive)
  (let ((from-buffer-name (buffer-name))
        (to-buffer-name nil))
    (when (string-match "\\.rb$" from-buffer-name)
      ;; create a corresponding buffer name
      (if (string-match "^test_" from-buffer-name)
          (setq to-buffer-name (substring-no-properties from-buffer-name 5))
        (setq to-buffer-name (concat "test_" from-buffer-name)))
      ;; if a buffer corresponding to the current buffer exists, get to there
      (when (find to-buffer-name
                  (mapcar #'buffer-name (buffer-list))
                  :test #'string=)
        (switch-to-buffer (get-buffer to-buffer-name))))))

これを,

(define-key ruby-mode-map (kbd "\C-cn") 'my-ruby-mode-find-test-buffer)

でC-cnに割り当て。
some.rb を編集中に C-cn すると,test_some.rb バッファがあれば,そこへ移動。
また,逆に test_some.rb を編集中に C-cn すると,some.rb へ移動。
それぞれ,行き先のバッファがなければ何もしない。
行き先がテストで,そのバッファが無いときには,作るようにするかどうか悩み中。またかなり色々を決め打ちしてるので要改良かな。

yari.el を少し改造

yari.el を見つけて使って見て,これ便利なんですが,
FQN での指定がしんどい。
修正した mcomplete 使って部分一致でもしんどい。
なので少しいじってみた。
結構前にいじった部分もあるので,あんまり覚えてないという・・・。


簡単にいうと,M-x yari [RET] open [RET]
で,open のドキュメントを全部引けるとかそういう感じだったはず。
ido-mode? を使用していると動かないかも。ワシは使ってないからわからん。
ちなみに

(define-key ruby-mode-map (kbd "\C-ch") 'yari)

で,C-ch に割り当ててます。

以下役に立たないと思われますが,Ver.0.5 との diff。

diff --git a/yari.el b/yari.el
index e4793b6..1e755f3 100644
--- a/yari.el
+++ b/yari.el
@@ -88,26 +88,30 @@
   (interactive (list nil current-prefix-arg))
   (let ((completing-read-func (if (null ido-mode)
                                   'completing-read
-				'ido-completing-read)))
+                                'ido-completing-read)))
     (setq ri-topic (or ri-topic
                        (funcall completing-read-func
-				"yari: "
-				(yari-ruby-obarray rehash)
-				nil
-				t
-				(yari-symbol-at-point)))))
-  (let ((yari-buffer-name (format "*yari %s*" ri-topic)))
-    (unless (get-buffer yari-buffer-name)
-      (let ((yari-buffer (get-buffer-create yari-buffer-name))
-            (ri-content (yari-ri-lookup ri-topic)))
-        (display-buffer yari-buffer)
-        (with-current-buffer yari-buffer
-          (erase-buffer)
-          (insert ri-content)
-          (ansi-color-apply-on-region (point-min) (point-max))
-          (goto-char (point-min))
-          (yari-mode))))
-    (display-buffer yari-buffer-name)))
+                                "yari: "
+                                (yari-ruby-obarray rehash)
+                                nil
+                                nil
+                                (yari-symbol-at-point)))))
+  (let ((yari-buffer-name (format "*yari %s*" ri-topic))
+        (yari-buffer nil))
+    (if (get-buffer yari-buffer-name)
+        (display-buffer yari-buffer-name)
+      (let ((ri-content (yari-ri-lookup ri-topic)))
+        (cond
+         ((null ri-content)
+          (message "Nothing known about %s" ri-topic))
+         (ri-content
+          (display-buffer (setq yari-buffer (get-buffer-create yari-buffer-name)))
+          (with-current-buffer yari-buffer
+            (erase-buffer)
+            (insert ri-content)
+            (ansi-color-apply-on-region (point-min) (point-max))
+            (goto-char (point-min))
+            (yari-mode))))))))
 
 (defun yari-symbol-at-point ()
   ;; TODO: make this smart about class/module at point
@@ -150,11 +154,14 @@
 
 (defun yari-ri-lookup (name)
   "Return content from ri for NAME."
-  (assert (member name (yari-ruby-obarray)) nil
-          (format "%s is unknown symbol to RI." name))
-  (shell-command-to-string
-   (format (concat yari-ri-program-name " -T -f ansi %s")
-           (shell-quote-argument name))))
+  ;; (assert (member name (yari-ruby-obarray)) nil
+  ;;         (format "%s is unknown symbol to RI." name))
+  (let ((output (shell-command-to-string
+                 (format (concat yari-ri-program-name " -T -f ansi %s")
+                         (shell-quote-argument name)))))
+    (if (string-match "Nothing known about" output)
+        nil
+      output)))
 
 (when-ert-loaded
  (ert-deftest yari-test-ri-lookup-should-generate-error ()


以上でーす。