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)))))