kiwanami / emacs-window-manager

Customizable window manager for emacs
230 stars 28 forks source link

emacsclient --tty disables e2wm:pst-minor-mode #34

Closed tkf closed 12 years ago

tkf commented 12 years ago

e2wm を有効にした Emacs に emacsclient --tty で接続して、その後にそのフレームを閉じると e2wm が無効になってしまいます。 debug オプションつけて様子を見ると以下のような感じになっていました。

   28 #KILL HOOK
   29 #KILL HOOK
   30 #KILL HOOK
   31 #KILL HOOK
   32 ## MAKE FRAME [#<frame F2 0x3a83390>] <- (#<frame *GNU Emacs* - emacs@tkf-lnp2 0xea7da0>)
   33 ## PST MM SWITCH [nil] / #<frame F2 0x3a83390>
   34 ## PST MM DISABLED
   35 #PST-FINISH

また、 emacsclient --tty FILENAME で接続すると、 emacs も emacsclient もハングするので Emacs 本体を kill するしかなくなります。ただし、 FILENAME が存在しないときはハングしません。 (以前は FILENAME が存在する時もハングしなかった気がしますが、それはどうやっても再現しなくなりました。。。) Emacs 24.0.94.1 で試しました。


そういえば、なんで e2wm:message ってマクロなんですか? デバッグのために e2wm.el をロードしなおすと他のモジュールで定義した pst-class が消えてしまってちょっと面倒です。。。

tkf commented 12 years ago

すいません、二番目のハングする問題は e2wm 関係ありませんでした。

tkf commented 12 years ago

補足ですが、 emacsclient --tty で接続しても、そのクライアント(フレーム)を閉じずに Emacs 本体に戻ってこれば e2wm は有効のままです。 その後、クライアントを閉じると e2wm が無効になります。

tkf commented 12 years ago

emacsclient は関係なく、 C-x 5 2C-x 5 0 などで新しいフレームを作って消しても同様の問題が出るようです。

tkf commented 12 years ago

良い策かどうか微妙な気がしますが、 #35 で修正できたと思います。

e2wm:pst-minor-mode-enable/disable-frame で add/remove-hook が呼ばれているのはなぜでしょうか? frame ごとに挙動を変えるなら、 hook や advice は入れっぱなしにして、 hook/advice 内で e2wm:managed-p を呼んで挙動を変えるほうがロバストな気がします。何か事情があるんでしょうか?

kiwanami commented 12 years ago

今回もありがとうございます!

debug がマクロなのは無効時の呼び出しコストを気にしていたからなのですが、複数の方から不便だという意見をいただいていますので関数(defsubst?)にしようと思います。

emacsclient とフレームは後回しにしていたところでした。e2wm:managed-p で分岐する方法は(自分の中では)後で確立された方法だったので、hookを操作しているのは不完全な実装です。hook, advice 入れっぱなしで managed-p で挙動を変えるほうがいいと思います。ただ、別フレームで同一バッファを表示したときに矛盾なく動くようにするにはどうすればいいか研究が必要だなと考えていました。

今回の問題ですが、こちらでも再現させてみました。以下の動きで合っているでしょうか?

○パターン1 (1-1) e2wmのフレームがある (1-2) emacsclient --tty でファイルを開く (1-3) emacsclient 上で編集してクライアントを終了させる (1-4) もとのフレーム上でe2wmが中途半端な状態になってe2wmの機能が動かなくなる

○パターン2 (2-1) e2wmのフレームがある (2-2) emacsclient --tty でファイルを開く (2-3) そのままもとのフレーム上に戻るとe2wmが中途半端な状態になってe2wmの機能が動かなくなる

頂いたパッチはパターン1が修正されるという理解であっていますか?

tkf commented 12 years ago

そうです、パターン1を修正しました。ちなみに、 「emacsclient --tty でファイルを開く」を「C-x 5 2 (make-frame-command) でフレームを開く」に変更しても同様の問題がおきます。 あと、 emacsclient --tty でファイルを開くかどうかは関係ありませんでした。 scratch バッファを開いても同様の問題がおきました。

fb9b71ded89399be91fe8d4df85c966b629d534e で C-x 5 2 で開いた場合の修正をし、 7f1679122daae7de944e69fad7021ac112d88d62 で emacsclient --tty で接続して終了させた場合にも対応させました。

ただ、パターン2はもともと問題なかった気がします(二番目のコメント参照)。今回のパッチで逆にバグ入れてしまいましたか?こちらでは、パッチの前後で問題出ません。

kiwanami commented 12 years ago

了解です。

こちらの環境ではパッチ適用前からパターン1,2ともダメだったので、もしかしたらまたバージョン依存かもしれません。 ちょっとver24で確認します。今週も移動などが重なるので少々お待ちください。

tkf commented 12 years ago

e2wm だけロードした Emacs 24.0.95.1 と 23.1.1 で、パッチ適用前(295944c5e1e7ed531fbffe359e6ff20847986d90)はパターン2は発生せず、パターン1のみ発生することを確認しました。使用したコマンドは以下です。

emacs -q -L ~/repos/branches/emacs-window-manager/ -L ~/repos/branches/emacs-window-layout/ --eval "(progn (setq server-name \"test\") (server-start) (require 'e2wm) (e2wm:start-management))"

emacsclient --socket-name test --tty
kiwanami commented 12 years ago

やっと確認出来ました。ありがとうございます。 時間がかかってすみません。