kiwanami / emacs-window-manager

Customizable window manager for emacs
230 stars 28 forks source link

Problem with comint-dynamic-list-completions #28

Open tkf opened 12 years ago

tkf commented 12 years ago
(comint-dynamic-list-completions '("a" "b" "c"))

を実行すると window の配置が壊れてしまいます。元の配置がmain windowの中で繰り返されるような感じになります。set-window-configuration などが comint-dynamic-list-completions から呼ばれているのが原因でしょうか。

Emacs 24.0.94.1 で確認しました。

kiwanami commented 12 years ago

いろいろ追い付いてなくてすいません。 e2wmはこういう明示的にWindowを扱うものとか key-sequence でイベントループ止めてしまうものに弱いです。。。 set-window-configuration はadviceしていますので多分大丈夫だと思いますが、with-output-to-temp-buffer が display-buffer でなにかしているのが影響しているかなという感じがしていますが、もうちょっと調べてみる必要があります。

tkf commented 12 years ago

いえいえ、お忙しいのに返答ありがとうございます。気づいたらどんどんissue入れてますが、優先度とかの判断はよろしくお願いします。気長に待ちます。

もう少し調べてみました。 comint-dynamic-list-completions -> display-completion-list -> (run-hooks 'completion-setup-hook) -> e2wm:override-setup-completion で e2wm が set-window-configuration を呼んでいるのにも関わらず、 comint-dynamic-list-completions もその後 set-window-configuration を呼んでいるのが原因ではないでしょうか。

e2wm:override-setup-completion の説明に

(defun e2wm:override-setup-completion ()
  ;;completionバッファが終了したとき、set-window-configurationが呼ばれずに
  ;;window配置が元に戻される。なので、completionから戻ったときには
  ;;windwo-configuration-change-hookを捕まえて自前で
  ;;window配置を直すようにする。
  ...)

とありますが、もし display-completion-list を呼ぶ関数が自前で set-window-configuration を呼んでいたら問題になるってことですよね?

tkf commented 12 years ago

きれいな方法じゃないですが、こんな感じでしのぐことにしました。

(defadvice comint-dynamic-list-completions
  (around my-e2wm-workaround activate)
  (flet ((e2wm:override-setup-completion ()))
    ad-do-it))

(defadvice completion-at-point
  (around my-e2wm-workaround activate)
  (flet ((e2wm:override-setup-completion ()))
    ad-do-it))