kiwanami / emacs-window-manager

Customizable window manager for emacs
229 stars 28 forks source link

Fix kill-buffer-hook: update after deleting from hist #32

Closed tkf closed 12 years ago

tkf commented 12 years ago

消したバッファが履歴に残るバグの修正です

tkf commented 12 years ago

履歴の先頭にあるバッファを消すと、そのウィンドウに表示されてるバッファがe2wmの管理下からはずれてしまうバグも見つけました。ちょっと修正してみます。

tkf commented 12 years ago

kill されたバッファに wlf:set-buffer しているのが原因でした。賢くバッファを探すための関数 e2wm:history-get-nearest を追加して対応しました。

kiwanami commented 12 years ago

遅くなりましてすいません。もともとのバグの再現方法を教えてもらってもいいですか?

tkf commented 12 years ago

最初のバグの再現方法は、

  1. 適当に recordable buffer をいくつか開く
  2. history list の見える perspective で バッファを消す
  3. 消したはずのバッファがリストに残っている
  4. 何らかの手段で e2wm:pst-update-windows を呼ぶとその時点で消える

って感じだったはずです。再現出来なければコードを戻してチェックしてみます。

2つ目の change set で直したバグは、同じバッファを複数の window で表示している場合に起きていたはずです。

自分でも忘れてしまっています。ちゃんとバグレポート書いておけば良かったです。。。

tkf commented 12 years ago

ちゃんと再現出来るか不安だったので、(一部)lispで書いてみました。

  1. Emacs を起動して以下のファイルを開きます(もしくは scratch にコピペ)。
  2. M-x eval-buffer RET
  3. "test-e2wm-3.txt" がカレントバッファになっているはずなので、それを kill します: C-x k RET
  4. "test-e2wm-3.txt" が履歴プラグインに残っているはずです。
  5. C-x C-b RET とかでウィンドウを更新すると、そのタイミングでhistory-listが更新されるので "test-e2wm-3.txt" が履歴から消えます。

e2wm 以外はロードしてない状態で確認しました。

(require 'e2wm)

(e2wm:start-management)
(find-file "test-e2wm-1.txt")
(find-file "test-e2wm-2.txt")
(find-file "test-e2wm-3.txt")

;; 1. Start Emacs and open this file.
;; 2. Start e2wm: M-x eval-buffer RET
;; 3. Kill "test-e2wm-3.txt": C-x k RET
;; 4. Then, you will see "test-e2wm-3.txt" in the buffer history.
;; 5. When you update history (e.g., C-x C-b RET), "test-e2wm-3.txt"
;;    burnishes from the history list.
kiwanami commented 12 years ago

いろいろ詰まってて反応遅くなってすみません。 手元の常用Emacsで試してみたところ再現しませんでした。 -q とかでいろいろ試してみます。

tkf commented 12 years ago

Emacs 23.1.1 で試してみましたが、再現しました。微妙な違い (C-x k したあとに見えるバッファが 24 だと test-e2wm-2.txt であるのに対して 23 では上の elisp code のバッファが見える) はありましたが、履歴が残る問題は同様にありました。

ちなみに、以下のように Emacs を起動しました。

% emacs-snapshot -q -L ~/repos/branches/emacs-window-manager/ -L ~/repos/branches/emacs-window-layout/ ~/junk/2012/04/01-121602-e2wm-bug-kill-buffer-hook.el

% emacs -q -L ~/repos/branches/emacs-window-manager/ -L ~/repos/branches/emacs-window-layout/ ~/junk/2012/04/01-121602-e2wm-bug-kill-buffer-hook.el     

また、 事前に find . -name "*.elc" | xargs rm -v で古いバージョンの elisp が読まれないようにしました。 window-layout, e2wm 共に最新のリビジョンです。

tkf commented 12 years ago

Pull request なのに push しまくってて?すいません! まったり pull してください><

kiwanami commented 12 years ago

Emacs 23.4.2 だと再現しなくて、 Emacs 24.0.95.1 だと再現しました。 ちょっと原因を詳しく追えてないのですが、Emacs 23.4.2 で特に副作用がなく、 Emacs 24.0.95.1 でこのパッチによって問題が修正されていることが確認出来ましたので取り込みます。

お手数をおかけしてすみません!ありがとうございました!!

tkf commented 12 years ago

精査ありがとうございます。 Emacs のバージョンによって挙動が変わるのは面倒ですね。。。 Hookの呼ばれるタイミングが違うんでしょうか? 次からはバージョン番号もフルで書くことにします。

kiwanami commented 12 years ago

24でdisplay-bufferがすこし変わっていたので気にはなっていたのですが、23.xでも起きていたのが意外でした。 修正コードを見ると、何で今まで動いていたんだろうという感じなのですが、そもそも kill-buffer をe2wmの上であんまりしてなくて、history-list の上でまとめてkillすることが多かったので気がついてなかっただけかもしれません。 毎回バグ修正していただいてありがとうございます。バグ多くてすいません。。。