From 6a91b84a41870d33e83013178561f1515516afca Mon Sep 17 00:00:00 2001 From: Karl Heuer Date: Thu, 4 Jun 1998 06:25:21 +0000 Subject: [PATCH] (rmail-toggle-header): Redo previous change; don't move point if possible. (rmail-count-screen-lines): Add. --- lisp/mail/rmail.el | 93 +++++++++++++++++++++++++++++----------------- 1 file changed, 58 insertions(+), 35 deletions(-) diff --git a/lisp/mail/rmail.el b/lisp/mail/rmail.el index b94f4657c6f..0f3063769a8 100644 --- a/lisp/mail/rmail.el +++ b/lisp/mail/rmail.el @@ -1780,42 +1780,65 @@ Otherwise, delete all header fields whose names match `rmail-ignored-headers'." With argument ARG, show the message header pruned if ARG is greater than zero; otherwise, show it in full." (interactive "P") + (let* ((buffer-read-only nil) + (pruned (rmail-msg-is-pruned)) + (prune (if arg + (> (prefix-numeric-value arg) 0) + (not pruned)))) + (if (eq pruned prune) + t + (rmail-maybe-set-message-counters) + (let ((at-point-min (= (point) (point-min))) + (all-headers-visible (= (window-start) (point-min))) + (on-header (save-excursion + (and (not (search-backward "\n\n" nil t)) + (progn + (end-of-line) + (re-search-backward "^[-A-Za-z0-9]+:" nil t)) + (match-string 0)))) + (old-screen-line (rmail-count-screen-lines (window-start) (point)))) + (save-excursion + (narrow-to-region (rmail-msgbeg rmail-current-message) (point-max)) + (if pruned + (progn (goto-char (point-min)) + (forward-line 1) + (delete-char 1) + (insert ?0) + (forward-line 1) + (let ((case-fold-search t)) + (while (looking-at "Summary-Line:\\|Mail-From:") + (forward-line 1))) + (insert "*** EOOH ***\n") + (forward-char -1) + (search-forward "\n*** EOOH ***\n") + (narrow-to-region (point) (point-max))) + (rmail-reformat-message (point-min) (point-max)))) + (cond (at-point-min + (goto-char (point-min))) + (on-header + (goto-char (point-min)) + (search-forward "\n\n") + (or (re-search-backward (concat "^" (regexp-quote on-header)) nil t) + (goto-char (point-min)))) + (t + (recenter old-screen-line) + (if (and all-headers-visible + (not (= (window-start) (point-min)))) + (let ((lines-offscreen (rmail-count-screen-lines + (point-min) (window-start)))) + (recenter (min (+ old-screen-line lines-offscreen) + ;; last line of window + (- (window-height) 2)))))))) + (rmail-highlight-headers)))) + +;; Lifted from repos-count-screen-lines. +;; Return number of screen lines between START and END. +(defun rmail-count-screen-lines (start end) (save-excursion - (let* ((buffer-read-only nil) - (pruned (rmail-msg-is-pruned)) - (prune (if arg - (> (prefix-numeric-value arg) 0) - (not pruned)))) - (if (eq pruned prune) - t - (rmail-maybe-set-message-counters) - (narrow-to-region (rmail-msgbeg rmail-current-message) (point-max)) - (if pruned - (let (window-at-top) - (goto-char (point-min)) - (forward-line 1) - (delete-char 1) - (insert ?0) - (forward-line 1) - (let ((case-fold-search t)) - (while (looking-at "Summary-Line:\\|Mail-From:") - (forward-line 1))) - (insert "*** EOOH ***\n") - (forward-char -1) - (search-forward "\n*** EOOH ***\n") - (forward-line -1) - (let ((temp (point))) - (when (search-forward "\n\n" nil t) - (if (< (window-start) (point)) - (setq window-at-top t)) - (delete-region temp (point)))) - (goto-char (point-min)) - (search-forward "\n*** EOOH ***\n") - (if window-at-top - (set-window-start (selected-window) (point) t)) - (narrow-to-region (point) (point-max))) - (rmail-reformat-message (point-min) (point-max))) - (rmail-highlight-headers))))) + (save-restriction + (narrow-to-region start end) + (goto-char (point-min)) + (vertical-motion (- (point-max) (point-min)))))) ;;;; *** Rmail Attributes and Keywords *** -- 2.39.2