scheme-complete.el を auto-complete.el で使う

 Schemeのシンボルを補完入力してくれる、scheme-complete.elを使い始めました。
 ソースコードの記述の違いを見て処理系を自動的に判断してくれるみたいです。
 scheme-complete.el の用意してくれる補完バッファが、なぜかうまく動作しなかったので、auto-complete.el で使えるようにしました。


scheme-complete.elをインストール

synthcode - scheme-completeから最新のscheme-complete.elをダウンロードします。

解凍して、ロードパスの通ったところに置きます。

gunzip -c scheme-complete-0.8.9.el.gz > scheme-complete.el
mv scheme-complete.el /usr/share/emacs/site-lisp/


設定(scheme-complete.el単体版)

.emacsscheme-complete 呼び出す設定を追加します。
※ auto-complete.el を使う場合この設定はいりません。

;; scheme-complete
(autoload 'scheme-smart-complete "scheme-complete" nil t)
(eval-after-load 'scheme
  '(define-key scheme-mode-map '[(control tab)] 'scheme-smart-complete))


使ってみる(scheme-complete.el単体版)

(l を書いた時点で、

(l

ここでおもむろに、C-tab を打つと

Click <mouse-2> on a completion to select it.
In this buffer, type RET to select the completion near point.

Possible completions are:
lambda      lcm      length        let    let*
let-syntax  lectrec  letrec-syntax list   list->string
; 以下略

と言う具合に、別バッファで補完リストが表示されます。

 なんですが!!、補完リストのバッファへ移動しようとして何かキーをタイプすると、バッファが閉じてしまうので、RETできず。マウスの中クリックは反応せず。なので、補完リストを見ながらユニークになるまでタイプすることになってしまっています。

 候補が1つだけの場合は別バッファが開かずその場で補完されます。


auto-complete.elで補完できるようにする

これでは不便なので auto-complete.el で選択できるようにします。

EmacsWiki: Auto Completeから auto-complete.el をダウンロードしてロードパスの通ったところに保存します。


保存したファイルに、scheme-mode と gauche-mode でも実行されるように以下のような追記をします。


(defcustom ac-modes
'(emacs-lisp-mode lisp-interaction-mode scheme-mode gauche-mode
auto-complete-mode-hook で追加しようとしたけれど出来なかったので、auto-complete.el 内の defcustom ac-modes に直接記述しました。


auto-complete.elがインストール済みで、バイトコンパイル済みの場合(auto-complete.elcが存在している場合)は、編集後にバイトコンパイルします。
M-x byte-compile-file


.emacs に auto-complete を呼び出す設定を追記します。

;; -----------------------------------------------------------
;; auto-complete
;; -----------------------------------------------------------
(when (require 'auto-complete nil t)
  (global-auto-complete-mode t)
  (define-key ac-complete-mode-map "\C-n" 'ac-next)
  (define-key ac-complete-mode-map "\C-p" 'ac-previous))


.emacsscheme-complete.el から補完リストを受け取るための設定を追記します。

;; scheme-mode-hook
(defvar ac-source-scheme
  '((candidates
     . (lambda ()
         (require 'scheme-complete)
         (all-completions ac-target (car (scheme-current-env))))))
  "Source for scheme keywords.")
(add-hook 'scheme-mode-hook
          '(lambda ()
             (make-local-variable 'ac-sources)
             (setq ac-sources (append ac-sources '(ac-source-scheme)))))

scheme-mode-hook が既に書いてある場合は、lambda の body 部分に設定を追記してください。

Emacs Wiki の Configuration example にある通りに書いても上手く行かないみたいです。
※補完候補が少ないときがあるのはなぜ?


使ってみる(scheme-complete.el&auto-complete.el)

(l を書いた時点で、
ピロっと、候補ダイアログが現れるので、
C-n や C-p で選んで、ENTERキーで決定。

これですごく便利になりました。