2015年07月27日

Emacsのauto-completeでRubyのドキュメントを引っ張れるrobeに手を入れてみる

どうもこんばんは。随分長いことblogを更新してない麦汁です。 ようやく気が向いたので更新。

で、最近またRoRに返り咲きしてまして、 そのついでにEmacsのRuby環境を整えたりしている。

その際に導入したのが robe という Rubyのコードアシスタンス機能を持つやつ。 Emacs LispだけではなくRubyも動かすちょっと贅沢なやつ。 auto-complete と組み合わせると幸せになれそうなやつ。

と思うじゃん? これ見てよ

http://mugijiru.up.seesaa.net/image/robe-to_s.png

わあい! to_s がいっぱい! 何だよこれこんなにいらねえぞどれがどれだよ泣くぞ。

http://mugijiru.up.seesaa.net/image/robe-to_s2.png

http://mugijiru.up.seesaa.net/image/robe-to_s3.png

っていうか全部同じドキュメント出しているじゃないかギャン泣きするぞ。

というわけで俺好みに修正する。

auto-complete の候補を引っ張ってくる関数が robe-complete-thing というやつになるんだけど まずこいつが “Kernel.to_s” なども “to_s” だけ拾って帰ってくるようになっているので もにゃもにゃと修正。

(defun robe-complete-thing (thing)
  (robe-start)
  (if (robe-const-p thing)
      (progn
        (robe-complete-exit)
        (robe-request "complete_const" thing (car (robe-context))))
    (destructuring-bind (target module instance _) (robe-call-context)
      (setq robe-specs-cache (make-hash-table :test 'equal))
      (mapcar (lambda (spec)
                (let* ((method (robe-spec-method spec))
                       (value (gethash method robe-specs-cache))
                       (prop-value (caar value))
                       result-string
                       result-value
                       klass
                       case-fold-search)
                  (puthash method (cons spec value) robe-specs-cache)
                  (if robe-highlight-capf-candidates
                      (propertize method 'face
                                  (if (string-match "\\`[A-Z]" method)
                                      'font-lock-type-facen
                                    'font-lock-function-name-face))
                    (setq klass (if (and value (stringp (caar value)))
                                    (caar value)
                                  ""))
                    (setq result-string method)
                    (setq result-value (if value
                                           (concat (caar value) "#" method )
                                         method))
                    (popup-make-item (propertize result-string 'value result-value)
                                     :summary (if (stringp klass)
                                                  klass
                                                "")))))
              (reverse
               (robe-request "complete_method" thing target module instance))))))

元々は method だけ返していた物を その text-property の value に “Class#method” という形の文字列を埋め込んだり popup の item の summary にクラス名を埋め込んだりしている。

次に、auto-completeのメニューを選んだ時に 右側に出て来るドキュメントを出す関数を修正

(defun ac-robe-doc (symbol)
  "Return popup documentation for `auto-complete'."
  (when robe-running
    (let* ((candidate (ac-selected-candidate))
           (dummy-spec (list (get-text-property 0 'summary candidate)
                             t
                             (substring-no-properties candidate)
                             nil))
           (document (robe-doc-for dummy-spec)))
        (concat symbol
                "\n\n"
                (cdr (assoc 'docstring document))))))

元々はsymbolを使ってrobe-specs-cacheから適当に最初の1個を引っ張り出して来ていたのを 修正したrobe-complete-thingの情報を無理矢理引っ張り出して robe-doc-for に送り込んでる。

ちなみに robe-doc-for は なんか robe の http なプロセスにGETでドキュメントを取りに行く関数

というわけで〜、これでauto-completeを実行すると〜

http://mugijiru.up.seesaa.net/image/robe-to_s4s.png

http://mugijiru.up.seesaa.net/image/robe-to_s5s.png

http://mugijiru.up.seesaa.net/image/robe-to_s6s.png

やったね! ちゃんと何のto_sかわかるし ちゃんとしたドキュメントも表示されるぞ! いえい!

というわけで幸せになれました。

本当はコンテキストに合わせて補完候補絞って欲しいけど今回はこれで勘弁してやる。

posted by 麦汁 at 00:37 | Comment(0) | TrackBack(0) | emacs | このブログの読者になる | 更新情報をチェックする

2014年04月21日

癒されたいEmacsユーザのための「cat-mode」作りましたにゃん

長らくこちらの更新を行ってない間に 消費税も上がってしまいましたね。

こんな世の中だからEmacsユーザの方も非常にしんどい状況かと思います。 主に左手小指が。

そのようなわけで、他に作ってる人もいないようなので、 Emacs上にいながら猫に癒される cat-mode を作りました。

使い方は簡単。 (add-to-list ‘load-path (expand-file-name “~/path/to/cat-mode”)) とかでload-pathを通して (require ‘cat-mode) でrequireして M-x cat-mode と入力して起動するだけで The Cat API を使って猫画像を拾って来て Emacs上に表示します。

cat-mode中は RET で別の画像を表示し、qでcat-modeを終了します。

というわけで、 癒されたくなればすぐにでも猫画像を見ることができます。そう、Emacsならね。

posted by 麦汁 at 22:45 | Comment(0) | TrackBack(0) | emacs | このブログの読者になる | 更新情報をチェックする

2013年12月14日

世界の麦汁アドベントカレンダー2013 麦汁さんとPHP

どうも。
こちらの記事は 世界の麦汁AdventCalendar2013 の13日目となります。

昨日はmugijiruによる日課の変更でした。

今日は最近ずっと使ってる言語、PHPについてお話をします。

PHPを触るようになったのは、まあ実は前職からですが
前職ではPHPを使った案件ですと、
PHPってよりもExcelとWebブラウザによるテストがメインだったので
ほとんどPHPには関われていませんでした><

が、今の職場に入ってしばらくしてからは
結構長いことPHPに触れられるようになっています。

PHPと言えばJavaに似せた素敵な構文と
順序に囚われない引数の並び、
そして高度すぎて未だに使ったことのないヘブライ語関係の変換機能など
素敵な特徴を標準で備えた言語として有名ですね。

それだけでなく言語としても年々成長しており
5.3では名前空間をサポートし、
5.4ではtraitというmixin機構が導入され
5.5ではさらにyieldという継続とかそのあたりの機能が導入されていて
みんな新しいバージョンを使ってみたくてwktkしていることだと思います。
僕もそうです! そういう人の一人です!

だが世の中簡単にそういうわけにはいかない。
聞いた話ではPHP3から5.4へ移行する素敵プロジェクトに入っている人もいらっしゃいますしね。

話は逸れましたがそんなわけで最近はずっとPHPを触っておりますが
正直面倒だし飽きた。
メソッドチェインな感じの言語じゃないので
1行で複数処理をしようとしたら
hoge(fuga(piyo()));
な感じになって右から左に処理を追うことになるのだるいし
色々と長くなりがちだし
引数どんな受付方するのかよくわからんしなので面倒です飽きた。

といいつつLaravelってフレームワークが気になってるので
誰かレクチャーしてください><

さて。Laravelのレクチャーは誰かPHPに精通した素敵な方がしてくださるとして
明日14日のアドベントカレンダーは誰が書いてくれるかな!?
麦汁さんは明日は飛行機乗ったりして忙しいので誰かやってくれると非常に助かります><
大変お手数をお掛けしますがよろしくお願い致します><

posted by 麦汁 at 01:14 | Comment(0) | TrackBack(0) | php | このブログの読者になる | 更新情報をチェックする
×

この広告は1年以上新しい記事の投稿がないブログに表示されております。