emacs-w3m + elscreen

elscreen + emacs-w3mを兼用しているとemacs-w3mのタブが表示されない.
んで, それを解決するパッケージがelscreen-w3mだと思うんだけど, それでも上手くいかないのでいじってみた.
どんな風にemacs-w3mを動作させてる環境を想定してるかというと, M-x w3mとすると新しいフレームを起動させて, タブ表示させてるようなの.
タブの表示は, elscreen-w3mに習ってそのままelscreenのタブを使用.
つか, elscreen-w3mをいじっただけだからね.

--- ./elscreen-w3m.el	2006-07-26 14:26:26.000000000 +0900
+++ /home/khiker/site-lisp/elscreen-w3m.el	2008-04-06 19:51:48.000000000 +0900
@@ -49,26 +49,57 @@
 (defun elscreen-w3m-mailto-url-popup-function (buffer)
   (elscreen-find-and-goto-by-buffer buffer 'create))
 
+;; edited by khiker
 (defadvice w3m-copy-buffer (around elscreen-w3m-copy-buffer activate)
-  (let ((current-buffer (current-buffer)))
-    (if (< (elscreen-get-number-of-screens) 10)
-        (elscreen-create)
+  (let ((current-buffer (current-buffer))
+        (w3m-pop-up-frames nil))
+    (cond
+     ((< (elscreen-get-number-of-screens) 10)
+      (elscreen-create))
+     (t
       (split-window)
-      (other-window 1))
+      (other-window 1)))
     (unless (ad-get-arg 0)
       (ad-set-arg 0 current-buffer))
-    ad-do-it))
+  ad-do-it))
+
+(defadvice w3m-close-window (around elscreen-w3m-close-window activate)
+;;  ad-do-it
+  (cond
+   ;; スクリーンが最後の1つで, フレームが2つ以上あったなら現在のを消す
+   ((and (= (elscreen-get-number-of-screens) 1)
+         (> (length (frame-list)) 1))
+    (delete-frame))
+   ;; スクリーンの数が1より多い
+   ;; 別のw3mを表示すればいいんだ.
+   (t
+    (elscreen-kill))))
+
+(defadvice w3m-quit (around elscreen-w3m-quit activate)
+  ad-do-it
+  ;; フレームが2つ以上あったなら現在のを消す
+  (when (> (length (frame-list)) 1)
+    (delete-frame)))
+
+(defadvice w3m (around elscreen-w3m activate)
+  ad-do-it
+  ;; 全てのスクリーンにw3mのバッファを割り当てる
+  (dolist (b (buffer-list))
+    ;; 今表示しているw3mバッファ以外の場合, 新しくスクリーンを作ってそこに割り当てる.
+    (when (and (string-match "\\*w3m\\*" (buffer-name b))
+               (not (string= (buffer-name) (buffer-name b))))
+      (elscreen-find-and-goto-by-buffer b t nil))))
 
 (defadvice w3m-favicon-retrieve (around elscreen-w3m-favicon-retrieve activate)
   ad-do-it
   (run-at-time 1 nil 'elscreen-notify-screen-modification 'force-immediately))
 
 (defun elscreen-w3m-initialize ()
-  (setq w3m-pop-up-frames nil)
-  (setq w3m-pop-up-windows nil)
-  (setq w3m-use-tab nil)
-  (setq w3m-use-tab-menubar nil)
-  (setq w3m-use-header-line nil)
+;;  (setq w3m-pop-up-frames nil)
+;;  (setq w3m-pop-up-windows nil)
+;;  (setq w3m-use-tab nil)
+;;  (setq w3m-use-tab-menubar nil)
+;;  (setq w3m-use-header-line nil)
   (setq w3m-mailto-url-popup-function-alist
         '((cmail-mail-mode . elscreen-w3m-mailto-url-popup-function)
           (mail-mode . elscreen-w3m-mailto-url-popup-function)

けっこう好き勝手いじったから, 無駄なことしてる部分もあると思う. つか, ある.
w3m-close-windowはアドバイスじゃなくて関数の定義潰しちゃえばいいじゃんとかね. 今更だからほったらかしだけどw

  • M-x w3m とすると*w3m*からはじまるバッファの分だけスクリーンを作って, それぞれ作ったスクリーンに割り当てる.
  • q を押すとスクリーンが2つ以上なら, そのスクリーンを閉じる. 1つならフレームを閉じる(フレームが2つ以上なら). ただし, *w3m*バッファはkillしない.
  • Q を押すとフレームが2つ以上なら*w3m*関係のバッファをkillしてフレームを閉じる.

主にこんな感じかなあ.
今のところ大丈夫げ. まあ, 使ってくうちにまたいじることになるんだろうなあ.



どうでもいいけど, UbuntuノートのEmacsだけアンチエイリアスの効いたフォントにしたら異様に快適.
DebianEmacsも最新にあげてアンチエイリアス効かせようかなあ. これはかなり良い.

追記

テストしてた際のゴミが残っていたのでそれを削除したパッチを再掲.
残っていたのは, dolistなんちゃら〜ってやつ.
scratch.elバッファないでテストすべきだったな. 失敗.

更新時刻

  • 1かいめ 2008年, 4月5日, 0時07分
  • 2かいめ 2008年, 4月6日, 19時58分