header-line-formatで遊ぶ

emux.elを少し試したときに、どうやってタブみたいなのを出しているんだろうと
思ってコードを見ていると header-line-formatというのを設定すると上部に
好きな文字が表示できるようです。


何か遊べそうだなということでいくつか書いてみました。

最近リリースされた CPANモジュールを 2秒ごとに表示する

(defvar header-cpan:new-modules nil)

(defun header-cpan:get-new-modules ()
  (let ((lst nil))
    (with-temp-buffer
      (call-process "cpanf" nil t t "-l")
      (goto-char (point-min))
      (while (not (eobp))
        (let ((bol (point)))
          (end-of-line)
          (push (buffer-substring-no-properties bol (point)) lst)
          (forward-line))))
    (reverse lst)))

(defface header-cpan:face
  '((t (:background "white" :foreground "red"
        :weight extra-bold :height 1.5)))
  "header face")

(defun header-cpan ()
  (interactive)
  (setq header-cpan:new-modules (header-cpan:get-new-modules))
  (header-cpan:update))

(defun header-cpan:update ()
  (let ((str (pop header-cpan:new-modules)))
    (setq header-line-format (and str (propertize str 'face 'header-cpan:face)))
    (redraw-display)
    (if str
	(run-at-time 2 nil 'header-cpan:update))))


M-x header-cpanの結果。(モジュールが 2秒ごとにヘッダに表示されていきます)

桜木凛の出演作品を 2秒ごとに表示していく

コード

(defvar header-rin:new-products nil)

(defvar header-rin:url
  "http://www.dmm.co.jp/mono/dvd/-/list/=/article=actress/id=23447/sort=date/rss=create/")

(defun header-rin:get-new-products ()
  (let ((lst nil))
    (with-temp-buffer
      (call-process "wget" nil t t "-q" "-O-" header-rin:url)
      (goto-char (point-min))
      (while (re-search-forward "^<title>\\([^<]+\\)</title>" nil t)
        (push (buffer-substring-no-properties (match-beginning 1)
                                              (match-end 1))
              lst)))
    ;; remove RSS title
    (cddr (reverse lst))))

(defface header-rin:face
  '((t (:background "white" :foreground "blue"
        :weight extra-bold :height 1.5)))
  "header face")

(defun header-rin ()
  (interactive)
  (setq header-rin:new-products (header-rin:get-new-products))
  (header-rin:update))

(defun header-rin:update ()
  (let ((str (pop header-rin:new-products)))
    (setq header-line-format (and str (propertize str 'face 'header-rin:face)))
    (redraw-display)
    (if str
	(run-at-time 2 nil 'header-rin:update))))


M-x header-rinの結果

おわりに

活用できそうな、活用できなさそうなものだなという印象。
emux.elはうまく使えていると思うけど、elscreenはあんまり
好きじゃないし、効果的に使うのがなかなか難しそうです。
出したり引っ込めたりは簡単にできるので、いろいろ活用術を
考えてみるのはいかがでしょうか。