トップ «前の日記(2005-11-21 (Mon)) 最新 次の日記(2005-11-26 (Sat))» 編集

猫熊は燃えつきた?!日記

最近なんにもやっていませんが、なにかやったらこちらに置くようにしています。
2002|12|
2003|01|02|03|04|05|06|07|08|09|10|11|12|
2004|01|02|03|04|05|06|07|08|09|10|11|12|
2005|01|02|03|04|05|06|07|08|09|10|11|12|
2006|01|02|03|04|05|06|07|08|09|10|11|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|01|02|03|04|05|06|07|08|09|10|11|12|
2009|01|02|03|04|05|06|07|08|09|10|11|12|
2010|01|02|03|04|05|06|07|08|
2011|09|
2012|02|


2005-11-24 (Thu) [長年日記]

w3m の buffer を elscreen 上で管理

こんな感じかぁ。もしかすると、洩れがあるかも。

  • 他の frame で w3m が見えていたら、その frame を使う。
  • screen 上で w3m があったら、その screen を使う。
  • じゃなかったら、新しい screen を作る。

でございます。継ぎ足し、継ぎ足しで作ったから結構冗長化。

  (defvar w3m-pop-elscreen t)
  
  (defadvice w3m-popup-buffer (around w3m-elscreen-poup-buffer activate)
    (if (or (not w3m-pop-elscreen)
            (memq this-command '(w3m-copy-buffer
                                 ;; w3m-goto-url-new-session
                                 w3m-view-this-url-new-session))
            (not (featurep 'elscreen))
            (save-window-excursion
              (catch 'detwin
                (let ((owin (selected-window))
                      (oframe (selected-frame)))
                  (mapcar (lambda (frame)
                            (unless (eq frame oframe)
                              (select-frame frame)
                              (mapcar (lambda (win)
                                        (set-buffer (window-buffer win))
                                        (when (eq major-mode 'w3m-mode)
                                          (throw 'detwin t)))
                                      (window-list))))
                          (frame-list))
                  nil))))
        (let ((w3m-pop-up-frames nil)
              (w3m-pop-up-windows nil))
          ad-do-it)
      (if (stringp buffer)
          (setq buffer (get-buffer buffer)))
      (let ((screen (elscreen-find-screen-by-buffer buffer))
            (create t))
        (when (and (not screen)
                   (memq this-command '(w3m-goto-url-new-session)))
          (if (not (eq major-mode 'w3m-mode))
              (setq create nil)
            (setq screen
                  (elscreen-find-screen
                   (lambda (num)
                     (elscreen-goto-internal num)
                     (save-selected-window
                       (catch 'find
                         (mapcar
                          (lambda (window)
                            (select-window window)
                            (when (and (eq major-mode 'w3m-mode)
                                       (not (eq (current-buffer) buffer)))
                              (throw 'find num)))
                          (window-list))
                         nil)))))))
        (if screen
            (progn
              (when (/= (elscreen-get-current-screen) screen)
                (elscreen-goto screen))
              (if (not (or (one-window-p)
                           (eq major-mode 'w3m-mode)))
                  (let* ((cwin (selected-window))
                         (win (previous-window cwin))
                         buf)
                    (catch 'detect
                      (while (not (eq cwin win))
                        (setq buf (window-buffer win))
                        (set-buffer buf)
                        (when (eq major-mode 'w3m-mode)
                          (select-window win)
                          (throw  'detect 'ok))
                        (setq win (previous-window win)))
                      (elscreen-create)
                      (set-window-buffer (selected-window) buffer)))
                (unless (eq (current-buffer) buffer)
                  (set-window-buffer (selected-window) buffer))))
          (when create
            (elscreen-create))
(set-window-buffer (selected-window) buffer))))) 欠点として、C-x2 してその window で w3m とかができなくなる。M-x w3m-other-window とか作るべきかも。とりあえず、抑制する変数を作っておいた。
以下は、瞬間的なでっちあげなので、今後どうなるかわからないけど、とりあえず。
  (defun w3m-no-elscreen (&optional url)
    (interactive
     (let ((url (w3m-examine-command-line-args))
           new)
       (list
        (or url
            (let ((default (if (w3m-alive-p) 'popup w3m-home-page)))
              (setq new (if current-prefix-arg
                            default
                          (w3m-input-url nil nil default
                                         (not (get-buffer "*w3m*"))))))))))
    (let (w3m-pop-elscreen)
      (cond ((eq url 'popup) (w3m))
            (t (w3m url)))))

elscreen の小ネタ(その一)

必要なさそうな screen はなるだけ勝手に閉じるようにする。大きなお節介なのでなにが起こるかわからないかも。
  (add-hook 'mew-suspend-hook 'elscreen-kill-buffer-force)
  (add-hook 'mew-quit-hook 'elscreen-kill-buffer-force)
  (add-hook 'navi2ch-exit-hook 'elscreen-kill-buffer-force)
  
  (defadvice w3m-close-window (after elscreen-kill-buffer activate)
    "Kill elscreen."
    (elscreen-kill-buffer-force))
  
  (defadvice w3m-quit (after elscreen-kill-buffer activate)
    "Kill elscreen."
    (elscreen-kill-buffer-force))
  
  (defadvice kill-buffer (after elscreen-kill-buffer activate)
    "Kill elscreen."
    (elscreen-kill-buffer))
  
  (defun elscreen-kill-buffer-force ()
    (elscreen-kill-buffer 'force))
  
  (defun elscreen-kill-buffer (&optional force)
    (when (and (not (elscreen-one-screen-p))
               (or force
        	   (memq this-command '(kill-buffer))))
      (let* ((cur (elscreen-get-current-screen))
             (buffer (current-buffer))
             (new (elscreen-find-screen
        	   (lambda (screen)
        	     (if (= cur screen)
        		 nil 
        	       (elscreen-goto-internal screen)
        	       (member buffer
        		       (mapcar (lambda (window)
        				 (window-buffer window))
        			       (window-list))))))))
        (cond
         (force
          (elscreen-kill)
          (when new
            (elscreen-goto new)))
         (t
          (when new
            (elscreen-kill)
  	    (elscreen-goto new)))))))

elscreen の小ネタ(その二)

C-zd で screen を開いて dired。
  (define-key elscreen-map "d" 'elscreen-dired)
(defun elscreen-dired (dirname &optional switches) (interactive (progn (or (featurep 'dired) (require 'dired)) (dired-read-dir-and-switches ""))) (elscreen-find-and-goto-by-buffer (dired-noselect dirname switches) 'create)) C-zC-f で directory を指定すれば OK なのは内緒。

elscreen の小ネタ(その三)

すでに森島さんには売り込んであるので、そのうちちゃんとしたものが出てくるかもしれないけど、Emacs(Meadow) に Drag & Drop したファイルを screen で開くもの。
  (defvar elscreen-dnd-buffers nil)
  
  (defadvice x-dnd-handle-drag-n-drop-event (around elscreen-dnd-buffers activate)
    (setq elscreen-dnd-buffers nil)
    (save-window-excursion ad-do-it)
    (when elscreen-dnd-buffers
      (elscreen-goto (car (mapcar
                           (lambda (buffer)
                             (elscreen-find-screen-by-buffer buffer 'create))
                           elscreen-dnd-buffers)))
      (setq elscreen-dnd-buffers nil)
      (elscreen-notify-screen-modification 'force-immediately)))
  
  (defadvice w32-drag-n-drop (around elscreen-dnd-buffers activate)
    (setq elscreen-dnd-buffers nil)
    (save-window-excursion ad-do-it)
    (when elscreen-dnd-buffers
      (elscreen-goto (car (mapcar
                           (lambda (buffer)
                             (elscreen-find-screen-by-buffer buffer 'create))
                           elscreen-dnd-buffers)))
      (setq elscreen-dnd-buffers nil)
      (elscreen-notify-screen-modification 'force-immediately)))
  
  (defadvice dnd-handle-one-url (after elscreen-get-dnd-buffers activate)
    (setq elscreen-dnd-buffers
          (cons (current-buffer) elscreen-dnd-buffers)))
本日のツッコミ(全4件) [ツッコミを入れる]
なおと (2005-11-25 (Fri) 11:46)

screenで開いてdiredは、C-z C-fでディレクトリを指定すればよかったりしません?ぼくはいつもそうしてるです。

なおと (2005-11-25 (Fri) 11:48)

あう、コメントに書いてた、ごめんなさいー。

ぱんだ (2005-11-25 (Fri) 13:24)

普段から dired は C-xC-f と C-xd と気分で両方使っているので作ってみましたーという感じです。<br>強いていえば、C-u で switch を指定できるから(って数年に一度ぐらいしか使わないけど)。

なおと (2005-11-26 (Sat) 16:58)

なるほど。C-z dあいてるし、次のには入れますね。


書いている人: 白井秀行 (mailto:shirai@meadowy。org)
訪問して下さった人: 今日: 人, 昨日: , 過去: 人 (2007年5月10日から)
RDF Feed