1
0
mirror of https://git.savannah.gnu.org/git/emacs.git synced 2024-12-03 08:30:09 +00:00

Make Rmail delete and undelete commands handle repeat count.

* lisp/mail/rmail.el (rmail-delete-message): Update summary.
(rmail-undelete-previous-message): Handle repeat count arg.
(rmail-delete-backward, rmail-delete-forward): Likewise.

* lisp/mail/rmailsum.el (rmail-summary-delete-forward):
Optimize case of reaching end and handling count.
(rmail-summary-mark-deleted): Optimize when N is current msg.
Don't create new summary line.
(rmail-summary-undelete): Pass arg to rmail-undelete-previous-message.
(rmail-summary-undelete-many): Rewrite for speed.
(rmail-summary-msg-number): New function.
This commit is contained in:
Richard M. Stallman 2014-03-21 19:09:02 -04:00
parent 0d8ac93e1c
commit 59271b3e86
3 changed files with 118 additions and 65 deletions

View File

@ -1,3 +1,17 @@
2014-03-21 Richard Stallman <rms@gnu.org>
* mail/rmailsum.el (rmail-summary-delete-forward):
Optimize case of reaching end and handling count.
(rmail-summary-mark-deleted): Optimize when N is current msg.
Don't create new summary line.
(rmail-summary-undelete): Pass arg to rmail-undelete-previous-message.
(rmail-summary-undelete-many): Rewrite for speed.
(rmail-summary-msg-number): New function.
* mail/rmail.el (rmail-delete-message): Update summary.
(rmail-undelete-previous-message): Handle repeat count arg.
(rmail-delete-backward, rmail-delete-forward): Likewise.
2014-03-21 Daniel Colascione <dancol@dancol.org>
* mail/emacsbug.el (report-emacs-bug): Include memory usage

View File

@ -3449,47 +3449,64 @@ STATE non-nil means mark as deleted."
"Delete this message and stay on it."
(interactive)
(rmail-set-attribute rmail-deleted-attr-index t)
(run-hooks 'rmail-delete-message-hook))
(defun rmail-undelete-previous-message ()
"Back up to deleted message, select it, and undelete it."
(interactive)
(set-buffer rmail-buffer)
(let ((msg rmail-current-message))
(while (and (> msg 0)
(not (rmail-message-deleted-p msg)))
(setq msg (1- msg)))
(if (= msg 0)
(error "No previous deleted message")
(if (/= msg rmail-current-message)
(rmail-show-message msg))
(rmail-set-attribute rmail-deleted-attr-index nil)
(if (rmail-summary-exists)
(with-current-buffer rmail-summary-buffer
(rmail-summary-mark-undeleted msg)))
(rmail-maybe-display-summary))))
(defun rmail-delete-forward (&optional backward)
"Delete this message and move to next nondeleted one.
Deleted messages stay in the file until the \\[rmail-expunge] command is given.
With prefix argument, delete and move backward.
Returns t if a new message is displayed after the delete, or nil otherwise."
(interactive "P")
(rmail-set-attribute rmail-deleted-attr-index t)
(run-hooks 'rmail-delete-message-hook)
(let ((del-msg rmail-current-message))
(if (rmail-summary-exists)
(rmail-select-summary
(rmail-summary-mark-deleted del-msg)))
(prog1 (rmail-next-undeleted-message (if backward -1 1))
(rmail-maybe-display-summary))))
(rmail-summary-mark-deleted del-msg)))))
(defun rmail-delete-backward ()
(defun rmail-undelete-previous-message (count)
"Back up to deleted message, select it, and undelete it."
(interactive "p")
(set-buffer rmail-buffer)
(let (value)
(dotimes (i count)
(let ((msg rmail-current-message))
(while (and (> msg 0)
(not (rmail-message-deleted-p msg)))
(setq msg (1- msg)))
(if (= msg 0)
(error "No previous deleted message")
(if (/= msg rmail-current-message)
(rmail-show-message msg))
(rmail-set-attribute rmail-deleted-attr-index nil)
(if (rmail-summary-exists)
(with-current-buffer rmail-summary-buffer
(rmail-summary-mark-undeleted msg))))))
(rmail-maybe-display-summary)))
(defun rmail-delete-forward (&optional count)
"Delete this message and move to next nondeleted one.
Deleted messages stay in the file until the \\[rmail-expunge] command is given.
A prefix argument is a repeat count;
negative argument means move backwards instead of forwards.
Returns t if a new message is displayed after the delete, or nil otherwise."
(interactive "p")
(let (value backward)
(if (< count 0)
(setq count (- count) backward t))
(dotimes (i count)
(rmail-set-attribute rmail-deleted-attr-index t)
(run-hooks 'rmail-delete-message-hook)
(let ((del-msg rmail-current-message))
(if (rmail-summary-exists)
(rmail-select-summary
(rmail-summary-mark-deleted del-msg)))
(setq value (rmail-next-undeleted-message (if backward -1 1)))))
(rmail-maybe-display-summary)
value))
(defun rmail-delete-backward (count)
"Delete this message and move to previous nondeleted one.
Deleted messages stay in the file until the \\[rmail-expunge] command is given."
(interactive)
(rmail-delete-forward t))
Deleted messages stay in the file until the \\[rmail-expunge] command is given.
A prefix argument is a repeat count;
negative argument means move forwards instead of backwards.
Returns t if a new message is displayed after the delete, or nil otherwise."
(interactive "p")
(rmail-delete-forward (- count)))
;; Expunging.

View File

@ -914,7 +914,10 @@ a negative argument means to delete and move backward."
(unless (numberp count) (setq count 1))
(let (end del-msg
(backward (< count 0)))
(while (/= count 0)
(while (and (/= count 0)
;; Don't waste time if we are at the beginning
;; and trying to go backward.
(not (and backward (bobp))))
(rmail-summary-goto-msg)
(with-current-buffer rmail-buffer
(rmail-delete-message)
@ -924,11 +927,13 @@ a negative argument means to delete and move backward."
(save-excursion (beginning-of-line)
(looking-at " *[0-9]+D")))
(forward-line (if backward -1 1)))
;; It looks ugly to move to the empty line at end of buffer.
(and (eobp) (not backward)
(forward-line -1))
(setq count
(if (> count 0) (1- count) (1+ count))))))
(if (> count 0) (1- count) (1+ count)))
;; It looks ugly to move to the empty line at end of buffer.
;; And don't waste time after hitting the end.
(and (eobp) (not backward)
(progn (setq count 0)
(forward-line -1))))))
(defun rmail-summary-delete-backward (&optional count)
"Delete this message and move to previous nondeleted one.
@ -939,8 +944,9 @@ a negative argument means to delete and move forward."
(rmail-summary-delete-forward (- count)))
(defun rmail-summary-mark-deleted (&optional n undel)
;; Since third arg is t, this only alters the summary, not the Rmail buf.
(and n (rmail-summary-goto-msg n t t))
(and n (not (eq n (rmail-summary-msg-number)))
;; Since third arg is t, this only alters summary, not the Rmail buf.
(rmail-summary-goto-msg n t t))
(or (eobp)
(not (overlay-get rmail-summary-overlay 'face))
(let ((buffer-read-only nil))
@ -951,9 +957,9 @@ a negative argument means to delete and move forward."
(progn (delete-char 1) (insert " ")))
(delete-char 1)
(insert "D"))
;; Register a new summary line.
;; Discard cached new summary line.
(with-current-buffer rmail-buffer
(aset rmail-summary-vector (1- n) (rmail-create-summary-line n)))))
(aset rmail-summary-vector (1- n) nil))))
(beginning-of-line))
(defun rmail-summary-update-line (n)
@ -1002,7 +1008,7 @@ Optional prefix ARG means undelete ARG previous messages."
(set-buffer rmail-buffer)
(rmail-pop-to-buffer rmail-buffer))
(and (rmail-message-deleted-p rmail-current-message)
(rmail-undelete-previous-message))
(rmail-undelete-previous-message 1))
(if rmail-enable-mime
(rmail-pop-to-buffer rmail-buffer))
(rmail-pop-to-buffer rmail-summary-buffer))
@ -1011,26 +1017,35 @@ Optional prefix ARG means undelete ARG previous messages."
(defun rmail-summary-undelete-many (&optional n)
"Undelete all deleted msgs, optional prefix arg N means undelete N prev msgs."
(interactive "P")
(with-current-buffer rmail-buffer
(let* ((init-msg (if n rmail-current-message rmail-total-messages))
(rmail-current-message init-msg)
(n (or n rmail-total-messages))
(msgs-undeled 0))
(while (and (> rmail-current-message 0)
(< msgs-undeled n))
(if (rmail-message-deleted-p rmail-current-message)
(progn (rmail-set-attribute rmail-deleted-attr-index nil)
(setq msgs-undeled (1+ msgs-undeled))))
(setq rmail-current-message (1- rmail-current-message)))
(set-buffer rmail-summary-buffer)
(setq rmail-current-message init-msg msgs-undeled 0)
(while (and (> rmail-current-message 0)
(< msgs-undeled n))
(if (rmail-summary-deleted-p rmail-current-message)
(progn (rmail-summary-mark-undeleted rmail-current-message)
(setq msgs-undeled (1+ msgs-undeled))))
(setq rmail-current-message (1- rmail-current-message))))
(rmail-summary-goto-msg)))
(if n
(while (and (> n 0) (not (eobp)))
(rmail-summary-goto-msg)
(let (del-msg)
(when (rmail-summary-deleted-p)
(with-current-buffer rmail-buffer
(rmail-undelete-previous-message 1)
(setq del-msg rmail-current-message))
(rmail-summary-mark-undeleted del-msg)))
(while (and (not (eobp))
(save-excursion (beginning-of-line)
(looking-at " *[0-9]+ ")))
(forward-line 1))
(setq n (1- n)))
(rmail-summary-goto-msg 1)
(dotimes (i rmail-total-messages)
(rmail-summary-goto-msg)
(let (del-msg)
(when (rmail-summary-deleted-p)
(with-current-buffer rmail-buffer
(rmail-undelete-previous-message 1)
(setq del-msg rmail-current-message))
(rmail-summary-mark-undeleted del-msg)))
(if (not (eobp))
(forward-line 1))))
;; It looks ugly to move to the empty line at end of buffer.
(and (eobp)
(forward-line -1)))
;; Rmail Summary mode is suitable only for specially formatted data.
(put 'rmail-summary-mode 'mode-class 'special)
@ -1188,6 +1203,13 @@ Search, the `unseen' attribute is restored.")
(goto-char (posn-point (event-end event)))
(rmail-summary-goto-msg))
(defun rmail-summary-msg-number ()
(save-excursion
(beginning-of-line)
(string-to-number
(buffer-substring (point)
(min (point-max) (+ 6 (point)))))))
(defun rmail-summary-goto-msg (&optional n nowarn skip-rmail)
"Go to message N in the summary buffer and the Rmail buffer.
If N is nil, use the message corresponding to point in the summary