続々auto-complete.elで悩む

どもです。
これを作ってて作るのにはあれがあれば便利だけどあれが未完成でそれを作る
のにはどれどれが必要でどれどれにはバグがあってバグを修正するのにはこれ
が必要でというような状態になっててにっちもさっちもいかん。
わっかになっているというかウロボロスというか輪廻転生というか急がば回れというか。
回ってたらスタートにもどるという感じ。
まあよくわかんということですわ。


どうもこないだのmy-auto-complete-toggle-sourceの挙動がよろしくないよう
なので,少し改良。見た目は改良されてない感じ。
ac-prefixがnilになって一生nilのまま過ごしてしまいそうな感触だったので,
自分で,各情報源のプリフィクス関数を呼び出してprefixを取得して,それを
ac-prefixに設定しちゃうという強引な感じ。


この関数を呼んだときの流れで呼び出されるac-start関数をedebugで追ってみたところ,
prefixの取得はうまくいっていて,ac-prefixにsetqしているんだけど,
なぜかac-prefixがnilになっているという不思議現象。というかたぶんワタシが
いらんことしてるというか,規約違反みたいことしてるんだろうと予想。
なので,少々強引な方法を使わせてもらってます。

※2013/02/22 (Fri) 18:43 修正

prefixが文字列だった場合に対応

(defun my-auto-complete-toggle-source ()
  (interactive)
  (let* ((completing-functions
          (loop for source in ac-sources ;(remove 'ac-source-dictionary ac-sources)
                for candidates-func = (cdr (assoc 'candidates (symbol-value source)))
                for prefix-func = (cdr (assoc 'prefix (symbol-value source)))
                for ac-prefix = (or ac-prefix
                                    (cond
                                     ((stringp prefix-func)
                                      (let ((beg
                                             (save-excursion
                                               (if (re-search-backward prefix-func
                                                                       (line-beginning-position)
                                                                       t)
                                                   (or (match-end 1)
                                                       (match-end 0))
                                                 nil))))
                                        (when beg
                                          (buffer-substring-no-properties
                                           beg (point)))))
                                     ((and (symbolp prefix-func)
                                           (fboundp prefix-func))
                                      (buffer-substring-no-properties
                                       (funcall prefix-func)
                                       (point)))
                                     (t
                                      nil)))
                ;; do (message "ac-prefix=%s, prefix=%s, source=%s"
                ;;             ac-prefix prefix (symbol-name 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))))))
    (when completing-functions
      (my-auto-complete-toggle-source-1 completing-functions))))

また変な挙動に気づいたら修正する予定。
関係ないけどctagsのソースのスタイルをきもいと思ってしまったワタシは
ゴミですね。