Pythonのヘルプをポップアップしてくれるelisp、py-doc-popupができるまで


秋の夜長、いかがお過ごしでしょうか。こんばんわ、myuhe a.k.a デスマ中にも関わらず、いつの間にかelispをいぢってたりするたわけ者 です。
さて、そのきっかけは、@kozo2さんのたわいもない一言

emacsのPython modeでcompletion-at-pointやった時にvimみたいにdocstringの表示できないんだろうか。Mon Sep 06 14:02:57 via web

これをほけーっと見てて、あー確かにポップアップできるようになったら便利だなーとか思っていたのでした。

んで、お仕事でPython書いてたら、いつの間にかelisp書いてました。
python.elに使えそうな関数があったのでそんなに手間をかけずにできてきたのですが、バッファにPythonのヘルプを実行した結果がなぜか入りません。結局、原因がわからずTL上のelisperのみなさんに助けをこうことに

pythonのドックストリングをカーソル位置でポップアップするelisp書いたんだけど、なせか2回評価しないとポップアップしないとゆーとんでもない粗悪品。。。Wed Sep 29 10:25:56 via KeySnail


というわけでハックしてくださる方、募集中です!! RT @myuhe: 先ほどのPythonのドックストリングをポップアップするelisp。 なぜか2回評価しないとポップアップしないんだけど。。。 “gist: 602537” – http://j.mp/aJ005yWed Sep 29 11:05:39 via KeySnail

すると、ありがたいことに@mori_devさんと@kiwanamiさんからコメントが。

@myuhe 整理するとけっこういいせんまでいけたのですが、comint.. の戻り値を取得できないところで諦めました! http://j.mp/cpU6xGWed Sep 29 13:01:13 via KeySnail


@myuhe comint-redirect〜が非同期の関数のようです。 comint-redirect-filter-functions で表示のイベントを取ってくるか、地味にタイマーでポーリングとかでしょうか。Wed Sep 29 14:17:34 via web


@myuhe gistでforkして100msec待つ簡単な修正をしてみました。ちゃんとするなら、中身が入るまでループして待つとか、filterでイベント拾ってdeferred開始という感じかなと思います。Wed Sep 29 14:26:55 via web

本当にありがとうございます。elispは 1割の括弧と9割の優しさでできているというのは本当なんですね!!
お二人のコードを拝借しながら、どうにか形になりました。kiwanamiさんからはdeferred.el使う必要はないかも、とのことでしたが、せっかく書いていただいたし、deferred.elの使用例としてそのままにしてます。

python.elで定義されている関数を使っているので、Emacs22以降推奨。そうでない場合は自前でインストールする必要があります。
当然deferred.elが必要です。
kiwanami’s emacs-deferred at master – GitHub
ポップアップにはpopup.elを使っているので、こちらも必要です。
m2ym’s auto-complete at master – GitHub
kozo2さんが希望されていたものと、ちょっと(かなり?)違う気もしますが、auto-complete.elに組みこむのだったら、たいした手間はかからないかも。
余裕がでてきたらやってみます。

20101001 20:41追記

deferred.elをdeffered.elとtypoしていたのを修正しました。
kiwanamiさん、ご指摘ありがとうございます。