続auto-complete.elで悩む

どもです。

昨日の続き。
なんとかできたっちゃーできたんですが,お客様満足度100%ではないなりよ。

簡単でもデモ

なんとなーく補完候補が切り替わってるのがわかると思います。

コード

やってることは,ac-sources内の情報源のcandidate関数を片っ端から呼び出して
nilを返さなかったら,その情報源に対応するac-complete-ほにゃらら関数を収集。
んで,トグルキーが押される度にそれらの関数を順番に呼んでいく,というもの。
変数my-auto-complete-index-in-ac-sourcesは,
補完候補を返すことが可能な関数群におけるインデックスです。
今思うと名前間違ってるよな−。
そしていじくると自動でバッファローカルになる変数です。

(setq my-auto-complete-index-in-ac-sources 0)
(make-variable-buffer-local 'my-auto-complete-index-in-ac-sources)

(defun my-auto-complete-toggle-source ()
  (interactive)
  (let ((completing-functions
         (loop for source in (remove 'ac-source-dictionary ac-sources)
               for candidates-func = (cdr (assoc 'candidates (symbol-value source)))
               when (and candidates-func
                         (symbolp candidates-func)
                         (fboundp candidates-func)
                         (funcall candidates-func))
               collect (intern-soft (replace-regexp-in-string "^ac-source"
                                                              "ac-complete"
                                                              (format "%s" source))))))
    (my-auto-complete-toggle-source-1 completing-functions)))

(defun my-auto-complete-toggle-source-1 (completing-functions)
  (prog1 (funcall (nth (% my-auto-complete-index-in-ac-sources
                          (length completing-functions))
                       completing-functions))
    (setq my-auto-complete-index-in-ac-sources
          (% (incf my-auto-complete-index-in-ac-sources)
             (length completing-functions)))))

んであとは,

(define-key ac-menu-map (kbd "\C-c\C-v") 'my-auto-complete-toggle-source)
(define-key java-mode-map (kbd "\C-c\C-v") 'my-auto-complete-toggle-source)

とかで,空いているキーに割り当ててればOK。

ちなみに,

(setq ac-use-menu-map t)

しておかないとダメだと思う。


まあとりあえず版で,これから改良できたらいいなと。
ちょっと便利になったからちょっとだけうれしいです。