Ruby関係の設定があまりにごちゃごちゃして汚いので整理してみた

そう. テスト前になるとテスト勉強やらずに部屋の掃除を始めるみたいに.



そもそも機能を把握しきってないのに入れすぎなんだよね.


ruby-electric-modeは, 色々なものの対応を補完入力してくれるモード.
例えば, whileを入力して, スペースを入れるとendを補完してくれたり, 片方の括弧を入れると対応する括弧も入れてくれたりする.
でもやっと気付いた.
こいつ, SKKとの相性が悪すぎる.
スペース潰してるから, 漢字変換できないし,
electric-modeの中でruby-modeをrequireしてるせいなのか, C-jで日本語入力モードに切り替えらんないし.
ということで, ruby-electric-modeは切っちゃった.



つーかほとんどの機能は, rails.elで賄えるみたいだしね. 括弧の対応は, brackets.elでやればいいし.
snippetが強力すぎる.
M-x list-abbrevsとかやると静的補完に登録されてる一覧が見れる.
Rubyのだけ数が異常.
それに, 静的補完をスペースでするためにabbrevs-modeにする必要はない.
タブキーを割り当て直してるから.
たぶんタブキーを押すと, 行頭なら通常のタブ, そうでないなら→静的補完→動的補完といくようになってる.
(ソース見た分けじゃないからそうとは言いきれないけど.)
とりあえず, endに対応するものの静的略語展開.

def def
if if, ife, elsif
class class
module modu, mods
unless unless
case case
while while
do do
until until
begin begin

moduleは, ちょっと展開した形が違うけど, moduでもmodsでもどちらでもOK.
ちなみに, caseの中で使うwhenもwhen+tabでちゃんと補完できる. また, rb+tabでshebangへ展開できる.
ifは, 3つの内どれでもOK. それぞれ簡単な違いがある(if-end if-else-end elsif).


次にri-ruby. これも結構便利.
Rubyのヘルプであるriを閲覧したり, それを使っての関数の補完などができる.
例えば, 「hav」って文字列があって, 「v」の後にカーソルがあるときに「C-M-i」を押すと「have_option?」に展開してくれる.
また, 「ha」のあとにカーソルがある場合のように, 複数候補がある場合, その一覧を別バッファに表示してくれる.
この際の補完は, マウスを使ってやるのかな?(補完したいものにマウスのカーソルを持っていってクリック.)



でも, これがちょっと面倒.
ちょっと調べたみたけど, キーボードでやるには新に出現した補完バッファに移動して選択しなきゃならんようなんだよなあ.
Emacsでマウスなんか使いたくないし.
前使ったときは, キーボードでできたような気もするけどなあ・・・.
丁度良い機会なので, キーボードのみでできるように関数をいじってみた.

追記(0115)

これ↓使わないでもキーボードだけでできた.
Emacs-lispのそれと同様.
具体的には, 新たに出た補完バッファを見ながら, 被らない位置まで入力して, C-M-iすればいい.
何やってんだorz
でもまあ, 一応下のも残しとくよ.
ミニバッファベースで補完だから, mcompleteとかと連携できるようになってるから無意味ってわけじゃないだろうし.

;; my-customized-ri-ruby-complete-symbol
(defun my-customized-ri-ruby-complete-symbol()
  "Complete symbol on ruby-mode."
  (interactive)
  (let* ((current    (current-word))
         (keyword     current)
         (classes    (ri-ruby-process-get-expr "CLASS_LIST_WITH_FLAG" keyword))
         (completion (try-completion current 'ri-ruby-complete-method nil))   )
    (cond
     ((eq completion t)
      (message "%s" (ri-ruby-method-with-class current classes))
      )
     ((null completion)
      (message "Can't find completion for \"%s\"" current)
      (ding)
      )
     ((not (string= current completion))
      (delete-region
       (save-excursion (search-backward current) (point))
       (point))
      (insert completion)
      (setq classes (ri-ruby-process-get-expr "CLASS_LIST_WITH_FLAG" completion))
      (message "%s" (ri-ruby-method-with-class completion classes))
      )
     (t
      (message "Making completion list...")
      (let ((selection (completing-read "Complete Symbol: " (all-completions current 'ri-ruby-complete-method) nil nil current)))
        (delete-region
         (save-excursion (search-backward current) (point))
         (point))
        (insert selection)
        )
      (message "%s" (ri-ruby-method-with-class completion classes))
      )
     ))
  )

ほとんど元関数であるri-ruby-comlete-symbolと同じ.
最後の方をちょっと強引に変えた.
あとは, こいつをこんな風にしてやれば, ri-rubyの設定さえしてあれば, C-M-iで使えるハズ.

(add-hook
 'ruby-mode-hook
 '(lambda()
    (progn
      (define-key ruby-mode-map "\M-\C-i" 'my-customized-ri-ruby-complete-symbol)
      )
    ))

なんかもうちょっと上手いelispのいじり方って無いモンかねえ・・・.
というかコレもrails.elでできそうな気がしないでもないけど, 調べるのが面倒. 改造しちゃったし.
(rails.elの機能がデカすぎて怖い.)


ついでに, 元に戻した括弧の対応の挿入(brackets.el使用).

(add-hook
 'ruby-mode-hook
 '(lambda()
    (progn
      ;; comment-columnの設定
      (setq comment-column 39)

      ;; camelCase-mode
      (camelCase-mode t)

      ;; C-m で 改行 + インデント
      (define-key ruby-mode-map "\C-m" 'ruby-reindent-then-newline-and-indent)

      ;; 対応する括弧の自動挿入
      (define-key ruby-mode-map "{" 'insert-braces)
      ;; ( で()を書く
      (define-key ruby-mode-map "(" 'insert-parens)
      ;; ' で''を書く
      (define-key ruby-mode-map "\'" 'insert-single-quotation)
      ;; " で""を書く
      (define-key ruby-mode-map "\"" 'insert-double-quotation)
      ;; [ で[]を書く
      (define-key ruby-mode-map "[" 'insert-brackets)
      ;; Ctrl+c }でregionを{}で囲む
      (define-key ruby-mode-map "\C-c}" 'insert-braces-region)
      ;; Ctrl+c )でregionを()で囲む
      (define-key ruby-mode-map "\C-c)" 'insert-parens-region)
      ;; Ctrl+c ]でregionを[]で囲む
      (define-key ruby-mode-map "\C-c]" 'insert-brackets-region)
      ;; Ctrl+c "でregionを""で囲む
      (define-key ruby-mode-map "\C-c\"" 'insert-double-quotation-region)

      ;; ri-emacsの設定
      (define-key ruby-mode-map [f1] 'ri)
      (define-key ruby-mode-map [f4] 'ri-ruby-show-args)
      (define-key ruby-mode-map "\M-\C-i" 'ri-ruby-complete-symbol)
      (define-key ruby-mode-map [C-tab] 'my-customized-ri-ruby-complete-symbol)
      (eval-expression (ri) nil)
      )
    ))

だいたいこんな感じ.
さっき改造したやつは, C-tabに割り当てた.
また, 1度, riを起動しとかないと何故かri-ruby-complete-symbolが上手く動かないので最後に起動しておいた.



まだまだ汚い.
もうちょっといじり中. でもある程度で抑えとかないとキリがない.

追記

やっぱりこれ「(eval-expression (ri) nil)」書いてちゃダメだ.
色々と上手く動かなくなる.
ri-rubyのコマンド使うには, Emacs起動したら最初にM-x riとかF1を押して, riを起動する必要があるね.