続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)
しておかないとダメだと思う。
まあとりあえず版で,これから改良できたらいいなと。
ちょっと便利になったからちょっとだけうれしいです。