auto-complete-etags.el の例のバグで,ヒントがっ!!

どもです。
どうにもならん状況でどうにもならんと諦めるわけにもいかず,
どうにかしないといけない。これはつらい。
よく考えると,どうにもならんと判断しているのは自分であって,
その事象が本当にどうにもならんかどうかは,わからない。
なので,どうにもならん状況に出会ったら,どうにもならんと思うよりも,
どうにかなる,どうにかできる,何かしらはできるはずと思うことが大事。
どうにもならんことなんてない。
どうもにならんくするのと,どうにかするのは全部自分次第。


あれ? オレめちゃくちゃいいこと言っている気がする。

branch を作って,デバッグプリントを仕込んだ。

おそらく,タグジャンプで飛んだ先でなにかしらが起こっているはずなので,
auto-complete.el 内のそれらしい関数内で,buffer-name を出力するようにしてみた。
そして,しばらく色々補完してもらったりしていじくっていたらっ!!
Message バッファから抜粋。

Saving file e:/cygwin/home/whitypig/prog/tmp/etags_demo.c...
Wrote e:/cygwin/home/whitypig/prog/tmp/etags_demo.c
DEBUG: ac-inline-hide, buffer=TestRun.h
Mark set [2 times]

来たのか? これはキタのか?
関数 ac-inline-hide 内で,バッファが編集中のバッファとは異なる状況が
発生している!


いや,別にこれが解決のヒントになるかどうかはわからないし,
ノーマルな動作なのかもしれませんが,なんかキタッ! と思ったので,
テンション上がって,色々書いてみました。
さてさてどうなることやら。

追記 2011/04/11 (Mon) 21:29

関数 ac-inline-hide 内で (current-buffer) と,ac-buffer の値を
表示するようにしてみたら・・・。

Saving file e:/cygwin/home/whitypig/prog/tmp/etags_demo.c...
Wrote e:/cygwin/home/whitypig/prog/tmp/etags_demo.c
DEBUG: ac-inline-hide, curernt-buffer=TestDB.h
DEBUG: ac-inline-hide, ac-buffer=etags_demo.c
Mark set [2 times]

なるほど。やっぱりね。


ほいで,この関数が何をしているかはわからなかったですが,
ほぼ間違いなく,タグジャンプで飛んだ先のバッファで,(delete-char 1)
することが,例のバグの原因だろうと。
なので,when に,「ac-buffer と (current-buffer) が同じ」という条件を
追加してみた。
とりあえず,これで様子を見てみる。
あとは,補完をキャンセルしたときに,編集中のバッファに空白が1つ
挿入される問題と,クイックヘルプの表示が崩れる問題だ。

(defun ac-inline-hide ()
  (when (ac-inline-live-p)
    (let ((overlay (ac-inline-overlay))
          (marker (ac-inline-marker))
          (buffer-undo-list t))
      (message "DEBUG: ac-inline-hide, curernt-buffer=%s" (buffer-name))
      (message "DEBUG: ac-inline-hide, ac-buffer=%s" ac-buffer)
      (when (and (eq ac-buffer (current-buffer)) overlay)
        (when (marker-position marker)
          (save-excursion
            (message "DEBUG: ac-inline-hide, in save-excursion, buffer=%s" (buffer-name))
            (goto-char marker)
            (delete-char 1)
            (set-marker marker nil)))
        (move-overlay overlay (point-min) (point-min))
        (overlay-put overlay 'invisible t)
        (overlay-put overlay 'display nil)
        (overlay-put overlay 'after-string nil)))))