auto-complete-mode の ac-source-words-in-buffer について。

どうもです。
auto-complete-mode,ありがたく使わせてもらってます。


ほいで,こないだ,ac-sources => (ac-source-words-in-buffer) な環境でちょっと気づいた。
あれ? アクティブなバッファ以外のバッファからも候補がでてる?
あれ〜? そうだったっけな。Meadow の時には,現在のバッファだけだった気がする。
どこで設定間違えた,オレ。

  • 補完元を全部のバッファを対象にしたい => ac-source-words-in-all-buffers
  • 補完元を現在のバッファにしたい => ac-source-words-in-buffer

という位置づけだと理解していたが,それが間違っているのかな?

ソース見てみた。

役者は,名前から判断するに,たぶん,

  • ac-candidate-words-in-buffer
  • ac-word-candidates

の二人。


scratchバッファで,色々試してみる。

(ac-candidate-words-in-buffer 0 "to") => nil

を確認。うん,これは問題ないっぽいね。
あー,本質的ではないけど,コメントが間違っていると思われます。
https://github.com/m2ym/auto-complete/blob/master/auto-complete.el
で言うと,1654行目は,Search backward ではなくて,Search forward ですね。おそらく。
re-search-forward 使っているし。ま,いいや。
ほいで,次。

(let ((ac-prefix "to"))
  (ac-word-candidates))
=> ("to" "to" "total" "to" "too" "town" "tournament" "took" "tourists" "told" "touch" "top" ...)

ぎゃっ。

ほいで,

(ac-define-source words-in-buffer
  '((candidates . ac-word-candidates)))

(ac-define-source words-in-all-buffer
  '((init . ac-update-word-index)
    (candidates . ac-word-candidates)))

って定義されている。
でもって,

;; 1.2 のコードを引用させてもらいます。
(defun ac-word-candidates (&optional buffer-pred)
  (loop initially (unless ac-fuzzy-enable (ac-incremental-update-word-index))
        for buffer in (buffer-list)
        if (and (or (not (integerp ac-limit)) (< (length candidates) ac-limit))
                (if buffer-pred (funcall buffer-pred buffer) t))
        append (funcall ac-match-function
                        ac-prefix
                        (and (local-variable-p 'ac-word-index buffer)
                             (cdr (buffer-local-value 'ac-word-index buffer))))
        into candidates
        finally return candidates))

内で,for buffer in (buffer-list) となっているので,
すべてのバッファが対象になってしまうというわけですね,たぶん。


でもでも,ac-candidate-words-in-buffer を edebug-defun して,
scratch バッファ内で "to" と入力したら,候補はでなかった。
んで,edebug-defun 解除して,"to" と入力すると,
どかどかっと候補がでる。ほぉわい?


うーん,自分で,ac-source-words-in-this-buffer みたいなのを作るのがいいのか?
それとも,どっかで設定ミスってる? (過去の経験からこれが可能性大)。
ま,それほど困ってないからいいけど,開いているバッファが大量になってくると,
もっさりしはじめるのが,気になるっちゃー気になる。
というかなんでオレは1.2を使っているんだ?
もしかしてそれが原因な気もしてきた。アップデートしよーっと。


最後に。作者様に感謝です。
ソースを見る度に,感動を覚えちゃいます。設計がすごいっていうんかなぁ。
テクなしのワタシにはまだまだわからないすごさがあるとは思いますが。