ポクポク

ポクッとしてツナッ

ENSIMEからのauto-complete.elを便利にする

auto-complete.el、異様に便利ですよね。
情報源を設定して、同じmodeのbufferの単語から補完したり、辞書作っておいたら辞書名と同じmodeや拡張子のbufferはその辞書を使ってくれるようになる。
http://cx4a.org/software/auto-complete/manual.ja.html#.E8.BE.9E.E6.9B.B8.E3.81.AB.E3.82.88.E3.82.8B.E8.A3.9C.E5.AE.8C


それはそうとして、Emacsから利用出来るScalaの補完エンジンでENSIMEというのもあります。
これの補完はauto-complete.elを使ってるんだけど、ENSIMEを起動させると
init.elとかに書いた情報源の設定とかが上書きされてムシられる。
ensime-auto-complete.elの380行目ぐらいでこんな感じで上書きしてる。

  (setq ac-sources '(ac-source-ensime-package-decl-members
		     ac-source-ensime-scope-names
		     ac-source-ensime-members ))

このせいで、Scalaを書く時に辞書とか他のscala-modeのbufferを補完に使えなくなってしまってる。
ENSIMEが補完してくれない感じのimplicitとかoverrideとかpackageとかの予約語とかをauto-completeの辞書につっこんだりしてるので使ってくれないと困る。

;;ensime
(add-to-list 'load-path (expand-file-name "~/.emacs.d/elisp/ensime/elisp/"))
(require 'ensime)
(add-hook 'scala-mode-hook 'ensime-scala-mode-hook)
; ここまでふつーのensimeの設定

(defun my-ac-scala-mode ()
  (add-to-list 'ac-sources 'ac-source-dictionary)
  (add-to-list 'ac-sources 'ac-source-yasnippet)
  (add-to-list 'ac-sources 'ac-source-words-in-buffer)
  (add-to-list 'ac-sources 'ac-source-words-in-same-mode-buffers)
  (setq ac-sources (reverse ac-sources)) ;;;追記2
  )

(add-hook 'ensime-mode-hook 'my-ac-scala-mode)

こんな感じのを書けばENSIMEと普段の補完がいっしょにできて便利になる。


あと、scala-modeのカッコ補完がイライラする感じになることがあるのでこれも貼っとくのがいいと思う。
http://www.callcc.net/diary/20101106.html


追記
メソッドとかの補完を優先したいけどどうすればいいんだろう


追記2 (2011/6/11)
ac-sourcesのリストの先頭のほうが優先されて、オムニ補完がうまくいかないことがあるらしい

情報源はac-sourcesの先頭にあるものほど優先的に使用されます。これはほとんどの場合では問題になりませんが、先に挙げたac-source-filenameというファイル名を補完する情報源は、オムニ補完(*)という機構を利用しているため、もし汎用的に単語を補完する情報源より後にac-source-filenameが出現する場合、単語を補完する情報源がac-source-filenameのオムニ補完の発生条件を飲み込んでしまって、うまくファイル名補完が開始されないことがあります。

http://dev.ariel-networks.com/wp/documents/aritcles/emacs/part9

ensime-modeの時のac-sourcesを見てみたらリストの最後のほうにensimeの補完系の情報源が入ってたので、
my-ac-scala-modeの最後で(setq ac-sources (reverse ac-sources))することにしたらうまくいった。
構文的に意味のある補完候補があればensimeさんが働いてそっちが出て、無いなら辞書とか同じバッファのテキストから補完される感じ。これがやりたかった。