[mew-dist 20996] 全文引用対策
KOIE Hidetaka ( 鯉江英隆 )
hide at example.com
2002年 5月 30日 (木) 02:21:21 JST
仕事のメイルで全文引用してくる人が多いので
なんとかするプログラムを書きました。
サマリバッファでHをたたくと、すっきりします。
メッセージバッファでHをたたくと、もとにもどります。
> うだうだ
> うだうだ
みじかい引用には手をつけません
> うだうだ
> うだうだ
> うだうだ
> うだうだ
> うだうだ
> うだうだ
> うだうだ
> うだうだ
> うだうだ
> うだうだ
> うだうだ
--
KOIE Hidetaka 鯉江英隆 <hide at example.com>
-------------- next part --------------
;; clearup.el -- 全文引用をすっきりさせる
;; 使用法:
;; バッファで
;; M-x clearup-do-buffer
;; これで5行を越える引用がすっきりする。
;;
;; -snip- がふくまれている引用のところで `H' を押すと
;; 見えなくなっていた部分が復元する。
;;
;; 再度 `H' を押すとまた見えなくなる。
;;
;; おしまいは
;; M-x clearup-undo-buffer
;;
;; mewから:
;; サマリバッファで `H' を押すとすっきりする。
;; `G' を押すともとにもどる。
;; メッセージバッファで引用部分で `H' を押すと復元する。
(defvar clearup-snip-string
"- - - s n i p - - - press H key to restore - - -\n")
(defun clearup-undo ()
"この不可視になっている引用ブロックを見えるようにする"
(interactive)
(mapcar (lambda (ov)
(when (and (overlay-get ov 'clearup)
(not (overlay-get ov 'invisible)))
(define-key (overlay-get ov 'local-map) "H" 'clearup-do)
(mapcar (lambda (ov2)
(when (and (overlay-get ov2 'clearup)
(overlay-get ov2 'invisible))
(delete-overlay ov2)))
(overlays-in (overlay-start ov) (overlay-end ov)))))
(overlays-at (point))))
(defun clearup-do1 (ov)
"この引用ブロックを不可視にする"
(let* ((beg (overlay-start ov))
(end (overlay-end ov))
(beg2 (save-excursion (goto-char beg)
(forward-line +1) (point)))
(end2 (save-excursion (goto-char end)
(forward-line -3) (point)))
(ov2 (make-overlay beg2 end2)))
(overlay-put ov2 'clearup t)
(overlay-put ov2 'evaporate t)
(overlay-put ov2 'intangible t)
(overlay-put ov2 'invisible t)
(overlay-put ov2 'after-string clearup-snip-string)))
(defun clearup-do ()
"この引用ブロックを不可視にする
ただし一度clearup-do-bufferを実行しておくのが前提"
(interactive)
(mapcar (lambda (ov)
(when (and (overlay-get ov 'clearup)
(not (overlay-get ov 'invisible)))
(define-key (overlay-get ov 'local-map) "H" 'clearup-undo)
(clearup-do1 ov)))
(overlays-at (point))))
(defun clearup-do-buffer-pass1 ()
"引用ブロックの抽出"
(let ((re mew-highlight-body-regex-cite))
(while (re-search-forward re nil t)
(beginning-of-line)
(let ((brandnew t)
(beg (point))
(end (save-excursion (end-of-line) (1+ (point)))))
(mapcar (lambda (ov)
(when (overlay-get ov 'clearup)
(move-overlay ov (overlay-start ov) end)
(setq brandnew nil)))
(overlays-at (1- (point))))
(when brandnew
(let ((ov (make-overlay beg end))
(map (make-sparse-keymap)))
(set-keymap-parent map (current-local-map))
(define-key map "H" 'clearup-undo)
(overlay-put ov 'clearup t)
(overlay-put ov 'evaporate t)
(overlay-put ov 'local-map map)
(overlay-put ov 'mouse-face 'highlight)))
(goto-char end)))))
(defun clearup-do-buffer-pass2 ()
"5行を越える引用ブロックを不可視にする
clearup-do-buffer-pass1()で検出した引用で5行以下のは忘れる"
(mapcar (lambda (ov)
(when (overlay-get ov 'clearup)
(let ((beg (overlay-start ov))
(end (overlay-end ov)))
(if (> (count-lines beg end) 5)
(clearup-do1 ov)
(delete-overlay ov)))))
(overlays-in (point-min) (point-max))))
(defun clearup-do-buffer ()
"バッファ中の引用で5行を越えるものを不可視にする"
(interactive)
(save-excursion
(goto-char (point-min))
(clearup-do-buffer-pass1))
(clearup-do-buffer-pass2))
(defun clearup-undo-buffer ()
"バッファ中の引用の不可視化をやめる"
(interactive)
(progn
(mapcar (lambda (ov)
(when (overlay-get ov 'clearup)
(delete-overlay ov)))
(overlays-in (point-min) (point-max)))))
;;mewからの利用
(when (boundp 'mew-version)
(defun mew-clearup-do ()
(interactive)
(let ((buf (get-buffer (mew-buffer-message))))
(when buf
(set-buffer buf)
(clearup-do-buffer))))
(defun mew-clearup-undo ()
(interactive)
(let ((buf (get-buffer (mew-buffer-message))))
(when buf
(set-buffer buf)
(clearup-undo-buffer))))
(define-key mew-summary-mode-map "H" 'mew-clearup-do)
(define-key mew-summary-mode-map "G" 'mew-clearup-undo)
(define-key mew-message-mode-map "H" 'mew-clearup-do)
(define-key mew-message-mode-map "G" 'mew-clearup-undo))
Mew-dist メーリングリストの案内