NotePad++とNppToRとR用自動補完API

R用エディタとしてはESS on Emacsが最強なのは間違いないですが,初心者にはとっつきづらいです。社会学界隈では大半の人が,エディタって何?おいしいの?ってレベルなので,とてもじゃないですがおすすめできません。

かといってWindowsのRはGUIがしょぼすぎる。というか実用レベルじゃない。プロンプトでshift+矢印で選択できないとかどういうこと?一向に改善されないのは開発者がみんなESS使ってるからなんでしょうか。

そこで外部エディタと連携させようというのが次善の策になるわけですが,おすすめしたいのがNotePad++NppToRの組み合わせです。NotePad++はプログラマ用エディタで,そこそこ人気らしいです。色付けやら自動補完やらいろいろ便利な機能が付いています。そしてNppToRは,NotePad++とRを連携させてくれるありがたいソフトウェアです。Rのデフォルトのエディタの代わりにNotePad++が使えてしまうわけです。

興味を持たれた方は,両方インストールしてRといっしょに立ち上げて,適当にコード書いて走らせてみてください。デフォルトではF8でRにコードが送られるようになってます。あと,R本体の設定をSDIに変えておくことをおすすめします。

さて,これだけでも十分ありがたいんですが,残念なことに自動補完が効きません。昔はできたのですが,NotePad++の仕様変更があってNppToRは追従できていないようです。そのうちできるようになるかもしれないですけど,いつになるかはわかりません。そんなの待ってられない。ということで作りました。

NotePad++の自動補完はかなり簡単に拡張できます。それぞれの言語用のXMLファイルを作ってフォルダに放り込むだけです。前はXMLですらなく補完して欲しい単語を羅列したベタテキストだったのですが,XMLに仕様が変わって,関数とセットで属性のポップアップもできるようになりました。せっかくなのでそこまで対応させたいですね。

で,膨大な数の関数を手打ちなんてしてられないので,自動で出力させるために書いたスクリプトが↓です。pure Rです。

.packages(TRUE)
plist <- c("foreign", "Hmisc", "lattice", "lme4", "memisc", "sem")
for(package in plist) library(package, character.only=TRUE)

flist <- sort(unlist(sapply(paste("^", letters, sep=""), apropos, mode="function")))

sink(file="./R.xml")
cat("<?xml version='1.0' encoding='Windows-1252' ?>",
    "<NotepadPlus>",
    "\t<AutoComplete language='R'>",
    "\t\t<Environment ignoreCase='yes' startFunc='(' stopFunc=')' paramSeparator=',' terminal='' />", sep="\n")
for(i in seq_along(flist)){
    arg <- formals(flist[i])
    name <- names(arg)
    if(is.null(arg)){
        cat("\t\t<KeyWord name='", flist[i], "' />\n", sep="")
    }else{
        cat("\t\t<KeyWord name='", flist[i], "' func='yes'>\n",
            "\t\t\t<Overload retVal=''>\n",
            paste("\t\t\t\t<Param name='", name, "' />\n", sep=""),
            "\t\t\t</Overload>\n",
            "\t\t</KeyWord>\n",
            "",sep="")
    }
}
cat("\t</AutoComplete>", "</NotepadPlus>", sep="\n")
sink()

最初の3行はインストールされてるパッケージの一覧見て補完に加えたいパッケージを選んで読み込んでるだけです。あとはアルファベット順に地道に関数をかき集めてXMLに整形して書き出してるだけです。走らせると,作業フォルダにR.xmlができてると思います。これをC:\Program Files\Notepad++\plugins\APIsに入れたら終わりです。

補完はこんな感じで出ます。
f:id:phosphor_m:20100121094359p:image

属性のポップアップはこんな感じ。
f:id:phosphor_m:20100121094400p:image

NotePad++はそこそこ軽いので,ESS使いの方も,ビューワーとして入れておいてもいいんじゃないかと思います。

できれば属性と初期値をセットで出したかったんですが,うまく動かなくて原因も不明だったので属性のみにしました。まああんまりぞろぞろ出てもうっとうしいし…。あと,ドットが入ってる関数は,属性のポップアップが効きません。read.csvとか,chisq.testとか。NotePad++がドットを単語の切れ目と認識してしまうようです。

追記

NotePad++の設定で,補完を有効にしておく必要があります。メニューバーから設定>環境設定>自動保存/入力補完です。