auto-complete.elとscheme-complete.elを連携させてみた

auto-complete.elとscheme-complete.elと,それぞれのソースを読みながら頑張った.一先ず動く所まで漕ぎ着けたのがこれ.

(add-to-list 'ac-modes 'scheme-mode)
(defvar ac-source-scheme-complete
  '((candidates
     . (lambda ()
         (all-completions
          ac-target
          (sort
           (mapcar 'symbol-name
                   (scheme-env-filter #'(lambda (x) t)
                                      (save-excursion
                                        (if (scheme-in-string-p) (scheme-beginning-of-string))
                                        (scheme-current-env))))
           #'(lambda (a b) (> (length a) (length b)))))))))

(add-hook 'scheme-mode-hook
          '(lambda ()
             (add-to-list 'ac-sources 'ac-source-scheme-complete)))

いろいろとこれでいいのかはよく分からない.ふと思ったけど,これ結構重いかもね.scheme-complete.elはちょっと重かった記憶がある.もしself-insert-commandの度にがたがたなるようだったら,ちょっと考えないとなぁ.(追記:4000行くらいのソースで試したら使い物にならなかった.毎回scheme-current-envを呼ぶのがいけないのかな.)


どこかにac-sourcesはmake-local-variableしろって書いてあった気がするけど,(少なくとも)version 0.3.0からはmake-variable-buffer-localされてるから,必要ないよね.


ac-source-symbolsにSchemeのシンボルが入ってるのは気のせいかな?ac-sourcesは(ac-source-symbols ac-source-words-in-buffer)なのに,バッファにないSchemeのシンボルが補完候補に出てくる.string-ci<=?とか.実際,上で定義したac-source-scheme-completeが入ってると,sortしてるから出る順番が違うし,ac-source-symbols自体に混じってそう.
あと,こういう時にM-:が割と便利ね.補完ができればもっと便利なんだけど.