woman で man を表示する際、新しいフレームを作成し、かつ、elscreen でマッチする man ページを全て表示する

woman で man を表示するとき、新しくフレームを作成するようにしてみました。

  • 新しくフレームを作成して man ページを表示する。
  • my-woman-all 関数を使って manpage ひくと、ja とかマッチしたもの全てを新しいフレームで elscreen の各スクリーンに開く。
  • q を押すと、バッファ名が '^*WoMan' にマッチするバッファを削除し、フレームを閉じる。

ってな感じで作ってみました。
何故か、woman が作成した manpage のバッファを Man-quit する時に削除しておかないと、同じ manpage を2度表示しようとしたとき、
フレームで表示してくれなかったので、明示的に削除するようにしてます。
# たぶん、woman.el の woman-find-file 内で、バッファが残っていると、Woman-find-buffer に成功し、その取得したバッファを使って表示しようとして、
# その先にある woman-really-find-file (別フレームに表示する関数) に処理がいかないためじゃないかなあと。

(defun my-woman-all ()
  (interactive)
  (let* ((at-point (current-word t))
         (exists (if at-point (call-process "man" nil nil nil at-point) nil))
         (topic (completing-read
                 (concat "Input (select) Manual Entry "
                         (cond
                          ((and at-point (= exists 0))
                           (format "(Default:%s)" at-point))
                          ((and at-point (> exists 0))
                           (format "(man -k %s)" at-point))
                          (t
                           ""))
                         "> ")
                 (cond
                  (at-point
                   (mapcar
                    'list
                    (split-string
                     (shell-command-to-string
                      (format "man -k %s | awk '{print $1}'" at-point))
                     "\n")))
                  (t
                   woman-topic-all-completions))
                 nil nil (if (and at-point (= exists 0)) at-point nil)))
         (files (woman-file-name-all-completions topic))
         (filenum (length files))
         (woman-buffer-alist nil))
    (when files
      (dotimes (i filenum)
        (let* ((file-name (car (nth i files)))
               (woman-use-own-frame (if (= i 0) t nil)))
          (when (> i 0)
            (elscreen-create))
          (catch 'exit
            (unless (ignore-errors
                      (woman-find-file file-name))
              (view-mode t)
              (woman-mode)))))
      (elscreen-jump-0)
      (set-frame-parameter nil 'alpha 1.0))))
;; (global-set-key "\C-xm" 'my-woman-all)

(defadvice woman0-so (around my-woman0-so ())
  (cond
   ((and (eq woman-use-own-frame t))
    (let* ((beg (point))
           (end (progn (woman-forward-arg 'unquote) (point)))
           (name (buffer-substring beg end))
           (files (woman-file-name-all-completions
                   (file-name-sans-extension (file-name-nondirectory name))))
           (filenum (length files)))
      (when files
        (dotimes (i filenum)
          (when (> i 0)
            (elscreen-create))
          (woman-find-file (car (nth i files))))
        (throw 'exit t))))
   (t
    ad-do-it)))
(ad-activate 'woman0-so)
;; (ad-deactivate 'woman0-so)

(setq woman-use-own-frame t)
(defadvice Man-quit (around my-woman-Man-quit ())
  (let ((woman-mode-p (eq major-mode 'woman-mode)))
    ad-do-it
    (when (and woman-mode-p
               (eq woman-use-own-frame t)
               (> (length (frame-list)) 1))
      (dolist (i (buffer-list))
        (when (string-match "^\\*WoMan" (buffer-name i))
        (kill-buffer (buffer-name i))))
      (delete-frame (selected-frame)))))
(ad-activate 'Man-quit)
;; (ad-deactivate 'Man-quit)

woman-use-own-frame をキーにするんじゃなくて、この挙動に変更する独自の変数を作った方がよかったも。
なんかどこかまずそうな気もしますが、とりあえず動いてるっぽという事でまあ、こんな感じで…。

追記

my-woman-all 関数をちょこっと修正。

  • 一部の manpage を表示しようとするとエラーを出したので、それを無理矢理抑制。
  • 一部の日本語翻訳された man とか、元々 woman で表示できないものを表示したとき、バッファが woman-mode & read-only にちゃんとなるように修正。

さらに追記

my-woman-all 関数をさらに修正。

  • ポイント直下の単語しか選べなかったものを completing-read で入力できるように修正。
    • ポイント直下の単語がデフォルトで入っている(それがマニュアルのエントリとしてちゃんとあれば)。
    • completing-read の補完候補として、man -k で出てきた候補が選べるようにした。

さらに修正

my-woman-all 関数をさらに修正。

  • ポイント下に単語がなかった場合の補完候補は、man に取れる補完全てとするように変更。
  • 新しく作るフレームは透過にならないように変更(半透明の上に半透明のフレームが重なると見辛いので…)。

更新時刻

  • 2010/02/25/02:00
  • 2010/02/25/22:50
  • 2010/02/25/23:30