「auto-complete.el」タグアーカイブ

auto-complete-modeで日本語を補完するac-ja.elを作った

Emacsでの日本語入力は専らDDSKKを使っています。

変換中の補完はDDSKKのskk-dcomp-multiple-activateがあるのですが、確定後の補完ができないのがいまいち不満でした。

誰か作ってるはずだと思い、いろいろ探してみましたが以外なことに目ぼしいものが見つからなかったので、いろいろな方のコードを拝借しながらauto-complete.elを使って日本語を補完するac-ja.elをいうのを書いてみました。

ac-ja.elとは

auto-complete-modeを使った日本語補完をサポートする、ふたつの情報源を提供します。
恐らく、いろいろなIMで使えるとは思いますが、DDSKKとの併用が便利ではないかと思います。

ダウンロード

ac-ja.elはMarmaladeというelispのリポジトリサイトに登録していますので、package.elをお使いの方はとても簡単にインストールできます。

package.elやMarmaladeからのダウンロードについて詳しくは以前書いたこちらを参考にしてください。

package.elをお使いでない方は、Githubから手動でダウンロードしてください。

myuhe/ac-ja.el – GitHub

以降では、各情報源ごとに必要な設定について書いていきます。

ac-source-dabbrev-jaとその設定

ac-source-dabbrev-jaは、その名のとおりdabbrevで日本語を収集して作られる情報源です。

requireしてac-sourcesに加えるだけで使えるようになるはずです。

(require 'ac-ja)
(setq ac-sources (append ac-sources '(ac-source-dabbrev-ja)))

これで、補完が開始される度にdabbrevがはしり、補完候補が集められます。DDSKKをお使いの方はjisyoバッファもdabbrevされるので、個人辞書に登録した単語も補完候補に出てくると思います。

ac-source-skkとその設定

ac-source-skkはSKKで使われる辞書ファイルから補完候補が作成される情報源です。DDSKKの利用が前提となります。

必要となる設定は次のような感じになります。

;;補完候補としたい辞書ファイルの場所を指定します。
(setq ac-skk-jisyo-file "~/SKK-JISYO.L")
;;補完候補生成に必要な中間ファイルを置く場所を指定します。
(setq ac-skk-alist-file "~/ac-skk-alist.el") 
(require 'ac-ja) 
(setq ac-sources (append ac-sources '(ac-source-skk)))

指定する辞書ファイルによって人名や地名などいろいろと補完できるようになるんではないかと思います。

また、この二つの情報源は併用して使うことも可能です。併用して使うとこんな感じになると思います。

http://img404.imageshack.us/img404/9422/006wq.png

文字列を確定したら自動的に補完を開始

DDSKKでは文字入力に独自の関数をあてていますので、ac-auto-startをtとしていても自動的に補完が開始されません。

そこで、自動的に補完を開始させるために以下のようなコードを.emacsにでも書いておきます。

(eval-after-load "skk"
  '(progn
     (defadvice skk-kakutei (after ad-skk-kakutei last)
       "skk-kakuteiの後にatuo-complete-modeによる補完を実行するadvice"
       (unless (minibufferp)
         (ac-start)))))

(add-hook 'skk-mode-hook 
          (lambda () 
            "skk-kakuteiのadviceを活性化" 
            (interactive)
            (ad-activate 'skk-kakutei)))

(defadvice skk-mode-exit (before ad-skk-mode-exit last)
       "skk-modeから抜ける時にskk-kakuteiのadviceを不活性化。"
       (ad-deactivate 'skk-kakutei))

これで自動的に補完ができるようになるはずです。

その他の雑多なこと

いろいろと制限がありまして、まずひらがなと漢字が混じると補完できません。ということなので、補完するのは主に漢字が並んだ名詞になると思います。

それとできてから気づいたのですが、auto-complete-modeってmigemoれないので、補完候補が膨大にあるとなかなか探すのが大変です。どなたかmigemoれるanythingインターフェイスで書き直してください。

それでは good補完ライフを

参考

ac-source-dabbrev-jaに関するコードは本家dabbrev.elのコードからいろいろと拝借しました。

ac-source-skkに関するコードはDDSKKのメンテナ、Kitamotoさんのskk-kakutei-extra.elからいろいろと拝借しました。

漢字で補完 – lisp_interactionの日記

素敵なコードありがとうございます!!

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

前にちょこっと書いてみたauto-complete-acr.elなるelisp。

Rを書くに、がんがんauto-completeできるのでかなり便利。でもう手放せない感じだったのですが、いろいろと不満もあったので書き直してみました。

前のバージョンのいけてなかったところ

前のバージョンについては、この辺を読んでもらうといきさつがわかるかもです。

emacsのpython-modeでもauto-complete.elを使う
auto-complete.elを拡張するR用のelispをさらに拡張してみた。

要は、auto-completeするときの補完候補は自前で作る必要があったわけです。それでも結構補完できたりするのですが、例えばパッケージで定義されている関数は、パッケージがインストールされた段階で補完候補リストを作ったりしないといけなかったのでかなりめんどう。新しくパッケージインストールしたりするとまた補完候補を作らないといけなかったりします。それと自分で作った関数を使うときは、これも自分で補完候補を編集しないといけないのでさらに面倒。できれば何もかんも自動でやってくれたらなー。

今回改良されたところ

ESSの内部で定義されている関数を使ってiESSバッファで読み込まれたパッケージやソースファイルを読んで動的に補完候補が生成されるようになりました。例えば、下のスクリーンショットはlibrary(“R2WinBUGS”)してパッケージを読み込んだ状態ですが、”as.”と打ち込んだ段階で、R2WinBUGSパッケージ内で定義されている関数、”as.mcmc”とかが補完候補にでてきてます。
acr
さらには、source(“hogehoge.r”)とかして、読み込んでしまえばhogehoge.rで定義していた自前関数も補完候補にリストされるようになります。つまり、たいていの関数なりオブジェクトなりが補完できるようになります。

使い方

まずは、auto-complete.el。githubからとってきましよう。trunkのやつで動くと思います。
m2ym’s auto-complete at master – GitHub
次は、auto-complete-acr.el。同じくgithubに置いてるので一番新しいやつをとってきます。久しぶりにgitコマンド使おうと思ったら、なんかかなり忘れててあせりました。
myuhe’s auto-complete-acr.el at master – GitHub

後は、.emacsに書くだけ。auto-complete自体の挙動をどうにかしたいときは、てきとーにごにょごにょしてください。yasnippet.elも入れておくと、さらに快適になります。
[cpp]
(require ‘auto-complete)
(require ‘auto-complete-yasnippet)
(require ‘auto-complete-acr)
[/cpp]
そしたら、まずはおもむろにM-x R。後は、パッケージとかソースファイルとか読み込ませた後でESSモードで開いたファイルにがんがん書いて実行します。実行した時にlibrary()などでパッケージを読み込めば、そのパッケージで定義されている関数が動的に補完候補になります。最初に補完するときだけは補完候補を作るのに時間がかかりますが、その後は結構サクサク動くと思います。

その他もろもろ

新しいやつでは補完できる関数がかなり増えたのですが、そのせいかスペックが低いPCで動かすとかなりもっさりします。その時は前のバージョンを使ってもらった方がいいかもしれません。
ubuntuとWinでは動作確認してます。多分Macでも動くと思います。動かねーとかあったら教えてください。