auto-complete.elを拡張するR用のelisp書いた


※20090608追記:以下に書いているelispはさらに拡張されバージョンアップしています。詳しくは、auto-complete.elを拡張するR用のelispをさらに拡張してみた。をご覧ください。

Rでコードを書くときは、もっぱらESS on emacs(meadow)で、すこぶる便利に使わせてもらっているのですが、唯一不満な点が補完でした。abbrev、dabbrevといちおあることはあるのですが、補完候補が何かコマンドを押さないと出てこないし、しかも補完候補がすごく見にくい。

実は、昔perl書くときに使っていたxyzzyはsiteinit.lにごにょごにょすると、この問題はあっさり解決してしまうわけで。

ミニバッファの補完候補リストをチップヘルプにする

この機能になれていたというのもあって、emacsの補完のしょぼさはかなり苦痛でした。といいながらもESSの便利さに負けてしまい、xyzzyはサブのエディタに降格してしまったわけですが・・・

んで、学会終わって余裕もできたので、たまにはemacsの環境整理でもしてみるかと、Rjpwiki見てたら谷村さんから次のようなコメントが・・・

ESSのメーリングリストにも投げたのですが、便利すぎるauto-complete.elのR用拡張って誰か書いていませんか。rubyとかc++用の拡張のみならず、octave用の拡張も書かれているのに、R用のものがまだありません。私家版ですでに書いている人がいれば、是非公開してみてください。auto-complete-modeが初耳の方はDemoを見てみてください。ESSのR-modeで使ってみましたが、便利すぎます。後はあらかじめキーワードなどをリストアップした拡張を作れば、さらに便利になるのですが。。。 — 谷村 2009-03-04 (水) 12:02:57

そもそもauto-complete.el自体を知らなかったので、調べてみるとなんかxyzzyの補完候補リストみたいなものを出してくれるんだそうな。しかも容易に拡張可能ですでに各種言語の拡張やoctaveの拡張まで出てるんだそうな。詳しくは動画デモを見てもらえるとその便利さがわかってもらえると思うです。後、以下のリンクも参考になります。

テキスト入力中に補完候補を自動的に表示してくれる auto-complete.el をリリースしました — ありえるえりあ
情報源による拡張が可能な auto-complete 0.1.0 をリリースしました — ありえるえりあ
auto-complete.el にやてふ拡張を作ってみた – がべこれログ – Garbage Collection Log

お~知らなかった。便利すぎるやないですか。しかし、octaveの拡張elispが出ていて、なぜRが出てないんだろう・・・

というわけで、すでにどなたか書かれているかもしれませんが、R用のauto-complete.el拡張elisp書いてみました。
ソースコードはこちらから。今回は初めてgithubにホスティングしてみました。
ちなみにスクリプトを書くにあたってauto-complete-octave.elを参考(というかほとんどまんま)をさせてもらいました。thanks Yen-Chin,Lee!!

使い方
1.auto-complete.elとauto-complete-acr.elをロードパスが通ったフォルダに起きます。

2..emacsに次の3行を追加します。

[cpp]
(require ‘auto-complete)
(global-auto-complete-mode t)
(require ‘auto-complete-acr)
[/cpp]

4.emacsでESSを起動します。
5.M-x auto-complete-modeします。

その他
・ESSモードとiESSモードのhookに引っかけています。

ソースコード見ていただくとわかるのですが、ただRの関数をリストにしてぶち込んでいるだけです。芸がなくてごめんなさい。
関数もnamespace:statsのものを取り込んだだけで、まだかなり不完全です。最初はNAMESPACEファイルを動的に読み込んでリスト化させようかと試みましたが、そこまでの芸当はできませんでした(当方lisp歴3日)。
手力でNAMESPACEファイルからリストを生成しています。NAMESPACEからlispのリスト生成に使ったpythonスクリプトも恥ずかしながらgithubに置いときます。

[python]
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# NAMESPACEにある関数名をlispで使えるように変換させます。
# NAMESPACEのexpoort()の括弧内にある関数名をコピーしてファイルを指定してから使ってください。

import re
mer = []
f = open("D:RscriptessNAMESPACE")
for line in f:
line = line.strip()
mer.append(line)
f.close()
out = "".join(mer)
out = re.sub(" ","",out)
out = re.sub(‘"’,"",out)
out = re.sub(",","" "",out)
out = re.sub("^""",’"’,out)
out = re.sub("$""",’"’,out)
[/python]

ということで、このコードはgithubにてhostして凄腕lisperの方のさらなるハックを期待したい・・・なる他力本願なことを考えています。
改良したelispを作られた方いらっしゃったら、是非githubのアカウントを取ってidを教えてください。collborateしてbrunchできるようにします。
まだまだ知名度の低いgithubですが、使い出すと面白いですのでガンガンbrunch、pushしてもらえると凄くうれしいです。

後、答えられるか甚だ不安ですが、動かんぞ!!とかこんな馬鹿な書き方あるか!!みたいなお叱りはコメントでお願いします。