EmacsでRのコード補完を快適にしてくれるauto-complete-acr.elがオムニ補完に対応しました。


Emacs Wiki更新情報を眺めていると、ac-R.elなるものを発見。

auto-complete.elのRインターフェイスが出てる!! “EmacsWiki: ac-R.el” – http://j.mp/cbrPMEMon Aug 23 22:48:03 via KeySnail

案の定、auto-complete.elのR用拡張でした。
ざーっと見た感じ、オムニ補完ができそうだし、古いバージョンのRでも補完ができるようになっていたりと、とても高機能っぽいです。
ちなみにオムニ補完とは、もともとVimの補完方法につけられている名称で(多分)、VSのインテリセンスのようなものだと思うとわかりやすいかもしれません。
これを使うと例えば、JavaやPythonのメソッドをさくっと補完していくことができるのですごく便利なのです。

で、早速使ってみたのですが、これがなかなか思うように動いてくれません。
まず、思いもよらないところでオムニ補完が働いたりするくせにオムニ補完してほしいところでしてくれません。これはオムニ補完のトリガーとなっている正規表現が変てこなことに起因するのですが、あまり肌に合いませんでした。
それと、オムニ補完時は、補完候補が読みこまれているオブジェクトに限定されるようになっているのですが、変なところでオムニ補完が働くせいで入力したいものが補完候補になかったりします。

というわけで結局, 肌にあったauto-complete-acr.elやねーということになったわけですが、せっかくなのでauto-complete-acr.elもオムニ補完ができるようにしてみました。
んですが書いた後に、そもそもCLOS風味なオブジェクトシステムのRでオムニ補完って必要なくね?という事に気がついたのですが、とりあえずアップデートしてGitHubに置いときます。

auto-complete-acr.el at master from myuhe’s auto-complete-acr.el – GitHub

インストールなぞは以前書いたこちらを参考にどうぞ。

ESS on Emacsで快適に補完できるauto-complete-acr.el0.2リリースしました

肝心のオムニ補完ですが、今のところデータフレームの列にアクセスする$演算子とS4クラスのスロットにアクセスする@演算子に対応しています。
動作している動画を見れば一目瞭然かと思います。動画ではデータフレーム”dat”で列やスロットを入力しています。

これまでデータフレーム等の要素にアクセスする際、例えばhoge$fugaのように入力する場合で考えると、hogeは補完できる可能性があったわけですが、fugaについてはほとんど手入力であったと思います。今回のオムニ補完では、$や@がトリガーとなってauto-completeするので、$より後ろのfugaについても補完候補から選択できるようになります。さらに、オムニ補完時にはトリガー($とか@)より前の文字列に応じて補完候補が絞られるので、効率的に候補選択することができるようになりました。
実は、もっとオムニ補完を働かせる場面ってあるかなーと思ってたのですが、意外にありませんでした。いやあ、CLOSって素晴らしいですね!!
ほかにオムニ補完をきかせたいシチュエーションがあったら、教えてもらえると嬉しいです。
最後になりましたが、補完候補を表示している際にいきなり補完候補が落ちる現象を確認しています。あまり気になるようでしたらac-source-omni-pre-list-essacrとac-source-omni-pre-class-essacrを情報源からはずしてみてください。

それでは Enjoy R and Emacs!!

  • cchang

    便利に使わせてもらっています。ありがとうございます。emacs 24.3だと起動時にinit.elを読みに行った時に、emacs memory exhausted–use m-x save-some-buffers retとエラーメッセージが表示されてしまいます。(require ‘auto-complete-acr)をコメントアウトするとエラーが出なくなるのは確認できました。環境はos x 10.8 でemacsはhomebrewを使ってインストールしました。24.2の時は大丈夫でした。

    • myuhe

      使っていただきありがとうございます。

      調査してみたいと思います。ちなみに、auto-completeによる補完はESS側でもすでに実装されております。動作もほとんど変わりませんので、そちらについても試してみてください。

      • cchang

        教えてくださりありがとうございます。ESS側によるauto-completeによる補完を試してみました。こちらは問題なく動作して,たしかに動作もほとんど変わりありませんでした。