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