Article View: gnu.emacs.vm.bug
Article #9676VM 5.26 -> 5.27 patch
From: Kyle Jones
Date: Fri, 15 Mar 1991 03:15
Date: Fri, 15 Mar 1991 03:15
1147 lines
43832 bytes
43832 bytes
Changes:
* fixed bug in vm-stuff-message-order; needed (cdr vm-message-list)
instead of (cdr vm-message-pointer).
* centralized code that VM executes once per Emacs session.
* eliminated the need for immediately loading other libraries
during the load of the main VM Lisp file, which should fix a
bug in the Makefile.
* cleaned up the vm function a bit, the code that tries to make
make sure that the totals blurb in left at the bottom of the
screen after startup is less grungy now.
* fuzzier grouping, spaces at end of the subject and after re:
are ignored.
* killing a killed buffer breaks older versions Andy Norman's
homebrewed kill-buffer function in gnuserv.el. VM no longer
stimulates the bug.
* fixed a couple of summary pointer update bugs in the VM
isearch code.
* better bindings for the mark commands.
* vm-forward-message just calls vm-send-digest when user tries to
use it with marks, instead of just chiding the user.
* VM feeps even less on motion errors to avoid disturbing
sensitive souls and sleeping spouses.
* various documentation corrections
* fixed bug bookmark bug; bookmark was being stuffed too soon,
i.e. before messages were renumbered properly
* when mail is sent the outbound mail buffer is renamed to "sent
..." to indicate that the mail has been sent.
* New command: vm-resend-message
* New command: vm-continue-composing-message
* `|' uses marks now
*** vm-delete.el.dist Sun Mar 3 23:54:04 1991
--- vm-delete.el Thu Mar 14 02:01:30 1991
***************
*** 45,56 ****
(setq mlist (cdr mlist)))
(vm-update-summary-and-mode-line)
(if (and vm-move-after-deleting (not used-marks))
! (if (or executing-kbd-macro (not (interactive-p)))
! (vm-next-message count t)
! (condition-case nil
! (vm-next-message count t)
! (beginning-of-folder (message "Beginning of folder"))
! (end-of-folder (message "End of folder")))))))
(defun vm-delete-message-backward (count)
"Like vm-delete-message, except that the deletion direction is reversed."
--- 45,51 ----
(setq mlist (cdr mlist)))
(vm-update-summary-and-mode-line)
(if (and vm-move-after-deleting (not used-marks))
! (vm-next-message count t executing-kbd-macro))))
(defun vm-delete-message-backward (count)
"Like vm-delete-message, except that the deletion direction is reversed."
***************
*** 81,92 ****
(setq mlist (cdr mlist)))
(vm-update-summary-and-mode-line)
(if (and vm-move-after-undeleting (not used-marks))
! (if (or executing-kbd-macro (not (interactive-p)))
! (vm-next-message count t)
! (condition-case nil
! (vm-next-message count t)
! (beginning-of-folder (message "Beginning of folder"))
! (end-of-folder (message "End of folder")))))))
(defun vm-kill-subject ()
"Delete all messages with the same subject as the current message
--- 76,82 ----
(setq mlist (cdr mlist)))
(vm-update-summary-and-mode-line)
(if (and vm-move-after-undeleting (not used-marks))
! (vm-next-message count t executing-kbd-macro))))
(defun vm-kill-subject ()
"Delete all messages with the same subject as the current message
*** vm-group.el.dist Wed Mar 6 00:05:14 1991
--- vm-group.el Wed Mar 13 18:03:11 1991
***************
*** 51,56 ****
--- 51,58 ----
(setcar vm-group-by-subject-closure subject)
(if (string-match "^\\(re: *\\)+" subject)
(setq subject (substring subject (match-end 0))))
+ (if (string-match " +$" subject)
+ (setq subject (substring subject 0 (match-beginning 0))))
(setq subject (concat "^\\(re: *\\)*"
(regexp-quote subject)
" *$"))
*** vm-motion.el.dist Sun Mar 3 23:54:05 1991
--- vm-motion.el Thu Mar 14 02:14:46 1991
***************
*** 96,112 ****
(not (or (vm-new-flag (car mp))
(vm-unread-flag (car mp)))))))))
! (defun vm-next-message (&optional count retry)
"Go forward one message and preview it.
With prefix arg COUNT, go forward COUNT messages. A negative COUNT
means go backward. If the absolute value of COUNT > 1 the values of the
variables vm-skip-deleted-messages and vm-skip-read-messages are
ignored."
! (interactive "p\np")
(vm-select-folder-buffer)
(vm-sanity-check-modification-flag)
(vm-check-for-killed-summary)
! (vm-error-if-folder-empty)
(or count (setq count 1))
(let ((oldmp vm-message-pointer)
(error)
--- 96,112 ----
(not (or (vm-new-flag (car mp))
(vm-unread-flag (car mp)))))))))
! (defun vm-next-message (&optional count retry signal-errors)
"Go forward one message and preview it.
With prefix arg COUNT, go forward COUNT messages. A negative COUNT
means go backward. If the absolute value of COUNT > 1 the values of the
variables vm-skip-deleted-messages and vm-skip-read-messages are
ignored."
! (interactive "p\np\np")
(vm-select-folder-buffer)
(vm-sanity-check-modification-flag)
(vm-check-for-killed-summary)
! (and signal-errors (vm-error-if-folder-empty))
(or count (setq count 1))
(let ((oldmp vm-message-pointer)
(error)
***************
*** 145,155 ****
;; message pointer is restored to its old value.
(if retry
(setq vm-message-pointer
! (let ((vm-message-pointer vm-message-pointer))
! (vm-move-message-pointer direction)
! (while (vm-should-skip-message vm-message-pointer)
! (vm-move-message-pointer direction))
! vm-message-pointer ))
(setq error 'beginning-of-folder)))
(end-of-folder
;; we bumped into the end of the folder without finding
--- 145,159 ----
;; message pointer is restored to its old value.
(if retry
(setq vm-message-pointer
! (condition-case ()
! (let ((vm-message-pointer vm-message-pointer))
! (vm-move-message-pointer direction)
! (while (vm-should-skip-message vm-message-pointer)
! (vm-move-message-pointer direction))
! vm-message-pointer )
! (beginning-of-folder
! (setq error 'beginning-of-folder)
! oldmp )))
(setq error 'beginning-of-folder)))
(end-of-folder
;; we bumped into the end of the folder without finding
***************
*** 159,169 ****
;; message pointer is restored to its old value.
(if retry
(setq vm-message-pointer
! (let ((vm-message-pointer vm-message-pointer))
! (vm-move-message-pointer direction)
! (while (vm-should-skip-message vm-message-pointer)
! (vm-move-message-pointer direction))
! vm-message-pointer ))
(setq error 'end-of-folder))))))
(if (not (eq vm-message-pointer oldmp))
(progn
--- 163,177 ----
;; message pointer is restored to its old value.
(if retry
(setq vm-message-pointer
! (condition-case ()
! (let ((vm-message-pointer vm-message-pointer))
! (vm-move-message-pointer direction)
! (while (vm-should-skip-message vm-message-pointer)
! (vm-move-message-pointer direction))
! vm-message-pointer )
! (end-of-folder
! (setq error 'end-of-folder)
! oldmp )))
(setq error 'end-of-folder))))))
(if (not (eq vm-message-pointer oldmp))
(progn
***************
*** 170,188 ****
(vm-record-and-change-message-pointer oldmp vm-message-pointer)
(setq vm-need-summary-pointer-update t)
(vm-preview-current-message)))
! (if error
! (signal error nil))))
! (defun vm-previous-message (&optional count retry)
"Go back one message and preview it.
With prefix arg COUNT, go backward COUNT messages. A negative COUNT
means go forward. If the absolute value of COUNT > 1 the values of the
variables vm-skip-deleted-messages and vm-skip-read-messages are
ignored."
! (interactive "p\np")
(or count (setq count 1))
(vm-select-folder-buffer)
! (vm-next-message (- count) retry))
(defun vm-Next-message (&optional count)
"Like vm-next-message but will not skip messages."
--- 178,196 ----
(vm-record-and-change-message-pointer oldmp vm-message-pointer)
(setq vm-need-summary-pointer-update t)
(vm-preview-current-message)))
! (and error signal-errors
! (signal error nil))))
! (defun vm-previous-message (&optional count retry signal-errors)
"Go back one message and preview it.
With prefix arg COUNT, go backward COUNT messages. A negative COUNT
means go forward. If the absolute value of COUNT > 1 the values of the
variables vm-skip-deleted-messages and vm-skip-read-messages are
ignored."
! (interactive "p\np\np")
(or count (setq count 1))
(vm-select-folder-buffer)
! (vm-next-message (- count) retry signal-errors))
(defun vm-Next-message (&optional count)
"Like vm-next-message but will not skip messages."
***************
*** 189,195 ****
(interactive "p")
(vm-select-folder-buffer)
(let (vm-skip-deleted-messages vm-skip-read-messages)
! (vm-next-message count)))
(defun vm-Previous-message (&optional count)
"Like vm-previous-message but will not skip messages."
--- 197,203 ----
(interactive "p")
(vm-select-folder-buffer)
(let (vm-skip-deleted-messages vm-skip-read-messages)
! (vm-next-message count nil t)))
(defun vm-Previous-message (&optional count)
"Like vm-previous-message but will not skip messages."
***************
*** 206,212 ****
(condition-case ()
(let ((vm-skip-read-messages t)
(oldmp vm-message-pointer))
! (vm-next-message)
;; in case vm-circular-folder is non-nil
(and (eq vm-message-pointer oldmp) (signal 'end-of-folder nil)))
(end-of-folder (message "No next unread message"))))
--- 214,220 ----
(condition-case ()
(let ((vm-skip-read-messages t)
(oldmp vm-message-pointer))
! (vm-next-message 1 nil t)
;; in case vm-circular-folder is non-nil
(and (eq vm-message-pointer oldmp) (signal 'end-of-folder nil)))
(end-of-folder (message "No next unread message"))))
*** vm-reply.el.dist Wed Mar 6 00:05:14 1991
--- vm-reply.el Thu Mar 14 22:01:28 1991
***************
*** 244,249 ****
--- 244,250 ----
(vm-mark-replied))
((eq vm-system-state 'forwarding)
(vm-mark-forwarded)))
+ (vm-rename-current-mail-buffer)
;; keep this buffer if the user demands it
(if (memq (current-buffer) vm-kept-mail-buffers)
(setq vm-kept-mail-buffers
***************
*** 251,257 ****
(setq vm-kept-mail-buffers (cons (current-buffer) vm-kept-mail-buffers))
(if (not (eq vm-keep-sent-messages t))
(let ((extras (nthcdr (or vm-keep-sent-messages 0) vm-kept-mail-buffers)))
! (mapcar 'kill-buffer extras)
(and vm-kept-mail-buffers extras
(setcdr (memq (car extras) vm-kept-mail-buffers) nil)))))))
--- 252,258 ----
(setq vm-kept-mail-buffers (cons (current-buffer) vm-kept-mail-buffers))
(if (not (eq vm-keep-sent-messages t))
(let ((extras (nthcdr (or vm-keep-sent-messages 0) vm-kept-mail-buffers)))
! (mapcar (function (lambda (b) (and (buffer-name b) (kill-buffer b)))) extras)
(and vm-kept-mail-buffers extras
(setcdr (memq (car extras) vm-kept-mail-buffers) nil)))))))
***************
*** 260,270 ****
--- 261,283 ----
as having been replied to, if appropriate."
(interactive)
(mail-send)
+ (vm-rename-current-mail-buffer)
(cond ((eq vm-system-state 'replying)
(vm-mark-replied))
((eq vm-system-state 'forwarding)
(vm-mark-forwarded))))
+ (defun vm-rename-current-mail-buffer ()
+ (if (not (= ?* (aref (buffer-name) 0)))
+ (if (not (string-match "^sent " (buffer-name)))
+ (rename-buffer (format "sent %s" (buffer-name))))
+ (require 'mail-utils)
+ (let (recipients)
+ (cond ((not (zerop (length (setq recipients (mail-fetch-field "To"))))))
+ ((not (zerop (length (setq recipients (mail-fetch-field "Cc"))))))
+ (t (setq recipient "the horse with no name")))
+ (rename-buffer (format "sent mail to %s" recipients)))))
+
(defun vm-mark-replied ()
(save-excursion
(let ((mp vm-reply-list))
***************
*** 358,410 ****
(vm-check-for-killed-summary)
(vm-error-if-folder-empty)
(if (eq last-command 'vm-next-command-uses-marks)
! (error
! (substitute-command-keys
! "Multiple messages should forwarded as a digest. Use \\[vm-send-digest]")))
! (let ((b (current-buffer))
! (dir default-directory)
! (mp vm-message-pointer)
! start)
! (save-restriction
! (widen)
! (cond ((vm-mail-internal
! (format "forward of %s:%s" (buffer-name)
! (vm-number-of (car vm-message-pointer)))
! nil
! (and vm-forwarding-subject-format
! (vm-sprintf 'vm-forwarding-subject-format
! (car mp))))
! (use-local-map (copy-keymap (current-local-map)))
! (local-set-key "\C-c\C-y" 'vm-yank-message)
! (local-set-key "\C-cy" 'vm-yank-message-other-folder)
! (local-set-key "\C-c\C-s" 'vm-mail-send)
! (local-set-key "\C-c\C-c" 'vm-mail-send-and-exit)
! (local-set-key "\C-c\C-v" vm-mode-map)
! (make-local-variable 'vm-forward-list)
! (setq vm-mail-buffer b
! vm-system-state 'forwarding
! vm-forward-list (list (car mp))
! vm-message-pointer mp
! default-directory dir)
! (goto-char (point-max))
! (insert "------- Start of forwarded message -------\n")
! (setq start (point))
! (insert-buffer-substring b
! (save-excursion
! (set-buffer b)
! (goto-char (vm-start-of (car mp)))
! (forward-line 1)
! (point))
! (vm-text-end-of (car mp)))
! (if vm-rfc934-forwarding
! (vm-rfc934-char-stuff-region start (point)))
! (insert "------- End of forwarded message -------\n")
! (goto-char (point-min))
! (end-of-line))))))
(defun vm-mail ()
"Send a mail message from within VM, or from without."
(interactive)
(vm-follow-summary-cursor)
(vm-select-folder-buffer)
(vm-check-for-killed-summary)
--- 371,423 ----
(vm-check-for-killed-summary)
(vm-error-if-folder-empty)
(if (eq last-command 'vm-next-command-uses-marks)
! (progn (setq this-command 'vm-next-command-uses-marks)
! (command-execute 'vm-send-digest))
! (let ((b (current-buffer))
! (dir default-directory)
! (mp vm-message-pointer)
! start)
! (save-restriction
! (widen)
! (cond ((vm-mail-internal
! (format "forward of %s:%s" (buffer-name)
! (vm-number-of (car vm-message-pointer)))
! nil
! (and vm-forwarding-subject-format
! (vm-sprintf 'vm-forwarding-subject-format
! (car mp))))
! (use-local-map (copy-keymap (current-local-map)))
! (local-set-key "\C-c\C-y" 'vm-yank-message)
! (local-set-key "\C-cy" 'vm-yank-message-other-folder)
! (local-set-key "\C-c\C-s" 'vm-mail-send)
! (local-set-key "\C-c\C-c" 'vm-mail-send-and-exit)
! (local-set-key "\C-c\C-v" vm-mode-map)
! (make-local-variable 'vm-forward-list)
! (setq vm-mail-buffer b
! vm-system-state 'forwarding
! vm-forward-list (list (car mp))
! vm-message-pointer mp
! default-directory dir)
! (goto-char (point-max))
! (insert "------- Start of forwarded message -------\n")
! (setq start (point))
! (insert-buffer-substring b
! (save-excursion
! (set-buffer b)
! (goto-char (vm-start-of (car mp)))
! (forward-line 1)
! (point))
! (vm-text-end-of (car mp)))
! (if vm-rfc934-forwarding
! (vm-rfc934-char-stuff-region start (point)))
! (insert "------- End of forwarded message -------\n")
! (goto-char (point-min))
! (end-of-line)))))))
(defun vm-mail ()
"Send a mail message from within VM, or from without."
(interactive)
+ (vm-session-initialization)
(vm-follow-summary-cursor)
(vm-select-folder-buffer)
(vm-check-for-killed-summary)
***************
*** 496,501 ****
--- 509,582 ----
(setq vm-mail-buffer b
default-directory dir))))))
+ (defun vm-resend-message (recipients)
+ "Resend the current message to someone else.
+ You will be proompted in the minibuffer for the space or comma
+ separated recipient list."
+ (interactive "sResend message to: ")
+ (vm-follow-summary-cursor)
+ (vm-select-folder-buffer)
+ (vm-check-for-killed-summary)
+ (vm-error-if-folder-empty)
+ (let ((vmp vm-message-pointer)
+ recipient-list t-buffer m-buffer
+ doomed-buffers
+ (pop-up-windows (and pop-up-windows (eq vm-mutable-windows t)))
+ (mail-header-seaprator ""))
+ (setq recipient-list (vm-parse recipients "[ \t,]*\\([^ ,\t]+\\)[ \t,]*"))
+ (unwind-protect
+ (progn
+ (vm-within-current-message-buffer
+ (vm-save-restriction
+ (widen)
+ (save-excursion
+ (setq m-buffer (generate-new-buffer "*VM resend*"))
+ (set-buffer m-buffer)
+ (make-local-variable 'vm-forward-list)
+ (setq vm-system-state 'forwarding
+ vm-forward-list (list (car vmp)))
+ (erase-buffer)
+ (insert-buffer-substring
+ (marker-buffer (vm-start-of (car vmp)))
+ (vm-start-of (car vmp))
+ (vm-text-end-of (car vmp))))))
+ (set-buffer m-buffer)
+ (goto-char (point-min))
+ ;; some mailers leave grot at the top of the message.
+ ;; trim it.
+ (while (not (looking-at vm-generic-header-regexp))
+ (delete-region (point) (progn (forward-line 1) (point))))
+ ;; delete all but pertinent headers
+ (while (looking-at vm-generic-header-regexp)
+ (let ((match-end-0 (match-end 0)))
+ (if (not (looking-at "X-VM-\\|Status:"))
+ (goto-char match-end-0)
+ (delete-region (point) match-end-0))))
+ (setq t-buffer
+ (generate-new-buffer
+ (format "transcript of resend to %s" recipients)))
+ (goto-char (point-min))
+ (message "Sending...")
+ (apply 'call-process-region
+ (nconc (list (point-min) (point-max)
+ sendmail-program
+ nil t-buffer mail-interactive
+ "-oi" "-oem")
+ (if mail-interactive
+ (list "-v")
+ (list "-odb"))
+ recipient-list))
+ (vm-mark-forwarded)
+ (set-buffer t-buffer)
+ (if (zerop (buffer-size))
+ (message "Sent.")
+ (display-buffer t-buffer)
+ (bury-buffer t-buffer)
+ (setq t-buffer nil)
+ (message "")))
+ (and t-buffer (kill-buffer t-buffer))
+ (and m-buffer (kill-buffer m-buffer)))))
+
(defun vm-send-digest (&optional prefix)
"Send a digest of all messages in the current folder to recipients.
You will be placed in a *mail* buffer as is usual with replies, but you
***************
*** 563,565 ****
--- 644,663 ----
(goto-char (point-min))
(end-of-line)
(message "Building digest... done"))))))
+
+ (defun vm-continue-composing-message ()
+ "Find and select the most recently used mail composition buffer.
+ Non Mail mode buffers and unmodified Mail buffers are skipped.
+ If no suitable buffer is found, the current buffer remains
+ selected."
+ (interactive)
+ (if (eq major-mode 'mail-mode)
+ (bury-buffer (current-buffer)))
+ (let ((blist (buffer-list)))
+ (while blist
+ (set-buffer (car blist))
+ (if (and (eq major-mode 'mail-mode)
+ (buffer-modified-p))
+ (progn (switch-to-buffer (car blist))
+ (setq blist nil))
+ (setq blist (cdr blist))))))
*** vm-save.el.dist Mon Aug 20 13:29:43 1990
--- vm-save.el Thu Mar 14 17:59:16 1991
***************
*** 294,304 ****
With one \\[universal-argument] the text portion of the message is used.
With two \\[universal-argument]'s the header portion of the message is used.
! Output is discarded. The message is not altered."
(interactive
! (progn
(vm-follow-summary-cursor)
! (list (read-string "Pipe message to command: " vm-last-pipe-command)
current-prefix-arg)))
(vm-select-folder-buffer)
(vm-check-for-killed-summary)
--- 294,309 ----
With one \\[universal-argument] the text portion of the message is used.
With two \\[universal-argument]'s the header portion of the message is used.
! When invoked on marked messages (via vm-next-command-uses-marks),
! each marked message is successively piped to the shell command,
! one message per command invocation.
!
! Output, if any, is displayed. The message is not altered."
(interactive
! ;; protect value of last-command
! (let ((last-command last-command))
(vm-follow-summary-cursor)
! (list (read-string "Pipe to command: " vm-last-pipe-command)
current-prefix-arg)))
(vm-select-folder-buffer)
(vm-check-for-killed-summary)
***************
*** 305,329 ****
(vm-error-if-folder-empty)
(setq vm-last-pipe-command command)
(let ((buffer (get-buffer-create "*Shell Command Output*"))
! (pop-up-windows (and pop-up-windows (eq vm-mutable-windows t))))
(save-excursion (set-buffer buffer) (erase-buffer))
! (save-restriction
! (widen)
! (cond ((equal prefix-arg nil)
! (narrow-to-region (vm-start-of (car vm-message-pointer))
! (vm-end-of (car vm-message-pointer))))
! ((equal prefix-arg '(4))
! (narrow-to-region (vm-text-of (car vm-message-pointer))
! (vm-text-end-of (car vm-message-pointer))))
! ((equal prefix-arg '(16))
! (narrow-to-region (vm-start-of (car vm-message-pointer))
! (vm-text-of (car vm-message-pointer))))
! (t (narrow-to-region (vm-start-of (car vm-message-pointer))
! (vm-end-of (car vm-message-pointer)))))
! (let ((pop-up-windows (and pop-up-windows (eq vm-mutable-windows t))))
! (call-process-region (point-min) (point-max)
! (or shell-file-name "sh")
! nil buffer nil "-c" command)))
(set-buffer buffer)
(if (not (zerop (buffer-size)))
(display-buffer buffer))))
--- 310,342 ----
(vm-error-if-folder-empty)
(setq vm-last-pipe-command command)
(let ((buffer (get-buffer-create "*Shell Command Output*"))
! (pop-up-windows (and pop-up-windows (eq vm-mutable-windows t)))
! ;; prefix arg doesn't have "normal" meaning here, so only call
! ;; vm-select-marked-or-prefixed-messages if we're using marks.
! (mlist (if (eq last-command 'vm-next-command-uses-marks)
! (vm-select-marked-or-prefixed-messages 0)
! (list (car vm-message-pointer)))))
(save-excursion (set-buffer buffer) (erase-buffer))
! (while mlist
! (set-buffer (marker-buffer (vm-start-of (car mlist))))
! (save-restriction
! (widen)
! (cond ((equal prefix-arg nil)
! (narrow-to-region (vm-start-of (car mlist))
! (vm-end-of (car mlist))))
! ((equal prefix-arg '(4))
! (narrow-to-region (vm-text-of (car mlist))
! (vm-text-end-of (car mlist))))
! ((equal prefix-arg '(16))
! (narrow-to-region (vm-start-of (car mlist))
! (vm-text-of (car mlist))))
! (t (narrow-to-region (vm-start-of (car mlist))
! (vm-end-of (car mlist)))))
! (let ((pop-up-windows (and pop-up-windows (eq vm-mutable-windows t))))
! (call-process-region (point-min) (point-max)
! (or shell-file-name "sh")
! nil buffer nil "-c" command)))
! (setq mlist (cdr mlist)))
(set-buffer buffer)
(if (not (zerop (buffer-size)))
(display-buffer buffer))))
*** vm-search.el.dist Sat Feb 23 19:54:13 1991
--- vm-search.el Thu Mar 14 00:40:50 1991
***************
*** 102,107 ****
--- 102,108 ----
;; If search is successful, move back to starting point
;; and really do quit.
(progn (goto-char opoint)
+ (vm-update-search-position)
(signal 'quit nil))
;; If search is failing, rub out until it is once more
;; successful.
***************
*** 372,377 ****
--- 373,379 ----
(setq mp nil))
(setq vm-message-pointer mp mp nil))
(setq mp (cdr mp))))
+ (setq vm-need-summary-pointer-update t)
(vm-update-summary-and-mode-line))))
(defun vm-isearch-forward ()
*** vm-vars.el.dist Sun Mar 3 23:54:06 1991
--- vm-vars.el Thu Mar 14 17:23:47 1991
***************
*** 211,217 ****
The SELECTOR is a Lisp symbol that tells VM how to decide whether a message
from one of the folders specifed by the FOLDER-NAMEs should be included
! in the virtual folder. Some SELECTORs require an arguemnt ARG; unless
otherwise noted ARG may be omitted.
The recognized SELECTORs are:
--- 211,217 ----
The SELECTOR is a Lisp symbol that tells VM how to decide whether a message
from one of the folders specifed by the FOLDER-NAMEs should be included
! in the virtual folder. Some SELECTORs require an argument ARG; unless
otherwise noted ARG may be omitted.
The recognized SELECTORs are:
***************
*** 242,248 ****
(defvar vm-folder-read-only nil
"*Non-nil value causes a folder to be considered unmodifiable by VM.
! Comamnds that modify message attributes or messages themselves are disallowed.
Commands that scan or allow the reading of messages are allowed but the
`new' and `unread' message flags are not changed by them.")
--- 242,248 ----
(defvar vm-folder-read-only nil
"*Non-nil value causes a folder to be considered unmodifiable by VM.
! Commands that modify message attributes or messages themselves are disallowed.
Commands that scan or allow the reading of messages are allowed but the
`new' and `unread' message flags are not changed by them.")
***************
*** 547,553 ****
--- 547,555 ----
(define-key map "r" 'vm-reply)
(define-key map "R" 'vm-reply-include-text)
(define-key map "\M-r" 'vm-resend-bounced-message)
+ (define-key map "B" 'vm-resend-message)
(define-key map "z" 'vm-forward-message)
+ (define-key map "c" 'vm-continue-composing-message)
(define-key map "@" 'vm-send-digest)
(define-key map "*" 'vm-burst-digest)
(define-key map "m" 'vm-mail)
***************
*** 572,582 ****
(define-key map "\M-s" 'vm-isearch-forward)
(define-key map "=" 'vm-summarize)
(define-key map "L" 'vm-load-rc)
! (define-key map "\C-c\r" 'vm-next-command-uses-marks)
! (define-key map "\C-c\C-@" 'vm-mark-message)
! (define-key map "\C-c " 'vm-unmark-message)
! (define-key map "\C-c\C-a" 'vm-mark-all-messages)
! (define-key map "\C-ca" 'vm-clear-all-marks)
(define-key map "\C-x\C-s" 'vm-save-buffer)
(define-key map "\C-x\C-w" 'vm-write-file)
(define-key map "\M-C" 'vm-show-copying-restrictions)
--- 574,586 ----
(define-key map "\M-s" 'vm-isearch-forward)
(define-key map "=" 'vm-summarize)
(define-key map "L" 'vm-load-rc)
! (define-key map "M" (make-sparse-keymap))
! (define-key map "MN" 'vm-next-command-uses-marks)
! (define-key map "Mn" 'vm-next-command-uses-marks)
! (define-key map "MM" 'vm-mark-message)
! (define-key map "MU" 'vm-unmark-message)
! (define-key map "Mm" 'vm-mark-all-messages)
! (define-key map "Mu" 'vm-clear-all-marks)
(define-key map "\C-x\C-s" 'vm-save-buffer)
(define-key map "\C-x\C-w" 'vm-write-file)
(define-key map "\M-C" 'vm-show-copying-restrictions)
*** vm-version.el.dist Wed Mar 6 00:05:15 1991
--- vm-version.el Wed Mar 6 12:05:51 1991
***************
*** 1,2 ****
! (defconst vm-version "5.26 (beta)"
"Version number of VM.")
--- 1,2 ----
! (defconst vm-version "5.27 (beta)"
"Version number of VM.")
*** vm-virtual.el.dist Sun Mar 3 23:54:06 1991
--- vm-virtual.el Thu Mar 7 00:07:05 1991
***************
*** 20,30 ****
(defun vm-visit-virtual-folder (folder-name &optional read-only)
(interactive
(progn
! (vm-load-rc)
(list
(completing-read "Visit virtual folder: " vm-virtual-folder-alist nil t)
current-prefix-arg)))
! (vm-load-rc)
(if (not (assoc folder-name vm-virtual-folder-alist))
(error "No such virtual folder, %s" folder-name))
(let ((buffer-name (concat folder-name " virtual"))
--- 20,30 ----
(defun vm-visit-virtual-folder (folder-name &optional read-only)
(interactive
(progn
! (vm-session-initialization)
(list
(completing-read "Visit virtual folder: " vm-virtual-folder-alist nil t)
current-prefix-arg)))
! (vm-session-initialization)
(if (not (assoc folder-name vm-virtual-folder-alist))
(error "No such virtual folder, %s" folder-name))
(let ((buffer-name (concat folder-name " virtual"))
*** vm.el.dist Wed Mar 6 00:05:15 1991
--- vm.el Thu Mar 14 17:10:05 1991
***************
*** 414,419 ****
--- 414,444 ----
(vm-copy-local-variables vm-summary-buffer
'vm-ml-highest-message-number))))
+ (defun vm-do-needed-renumbering ()
+ (if vm-numbering-redo-start-point
+ (progn
+ (vm-number-messages (and (consp vm-numbering-redo-start-point)
+ vm-numbering-redo-start-point)
+ vm-numbering-redo-end-point)
+ (setq vm-numbering-redo-start-point nil
+ vm-numbering-redo-end-point nil))))
+
+ (defun vm-do-needed-summary-rebuild ()
+ (if (and vm-summary-redo-start-point vm-summary-buffer)
+ (progn
+ (vm-do-summary (and (consp vm-summary-redo-start-point)
+ vm-summary-redo-start-point))
+ (setq vm-summary-redo-start-point nil)
+ (and vm-message-pointer
+ (vm-set-summary-pointer (car vm-message-pointer)))
+ (setq vm-need-summary-pointer-update nil))
+ (and vm-need-summary-pointer-update
+ vm-summary-buffer
+ vm-message-pointer
+ (progn
+ (vm-set-summary-pointer (car vm-message-pointer))
+ (setq vm-need-summary-pointer-update nil)))))
+
(defun vm-reverse-link-messages ()
(let ((mp vm-message-list) prev)
(while mp
***************
*** 940,946 ****
;; Insert a header into the first message of the folder that lists
;; the folder's message order.
(defun vm-stuff-message-order ()
! (if (cdr vm-message-pointer)
(save-excursion
(vm-save-restriction
(widen)
--- 965,971 ----
;; Insert a header into the first message of the folder that lists
;; the folder's message order.
(defun vm-stuff-message-order ()
! (if (cdr vm-message-list)
(save-excursion
(vm-save-restriction
(widen)
***************
*** 954,967 ****
buffer-read-only lim n
(mp (copy-sequence vm-message-list))
(inhibit-quit t))
- ;; make sure the message numbers are up to date.
- (if vm-numbering-redo-start-point
- (progn
- (vm-number-messages (and (consp vm-numbering-redo-start-point)
- vm-numbering-redo-start-point)
- vm-numbering-redo-end-point)
- (setq vm-numbering-redo-start-point nil
- vm-numbering-redo-end-point nil)))
(setq mp
(sort mp
(function
--- 979,984 ----
***************
*** 1002,1027 ****
(set-buffer-modified-p (buffer-modified-p))))
(defun vm-update-summary-and-mode-line ()
! (if vm-numbering-redo-start-point
! (progn
! (vm-number-messages (and (consp vm-numbering-redo-start-point)
! vm-numbering-redo-start-point)
! vm-numbering-redo-end-point)
! (setq vm-numbering-redo-start-point nil
! vm-numbering-redo-end-point nil)))
! (if (and vm-summary-redo-start-point vm-summary-buffer)
! (progn
! (vm-do-summary (and (consp vm-summary-redo-start-point)
! vm-summary-redo-start-point))
! (setq vm-summary-redo-start-point nil)
! (and vm-message-pointer
! (vm-set-summary-pointer (car vm-message-pointer))))
! (and vm-need-summary-pointer-update
! vm-summary-buffer
! vm-message-pointer
! (progn
! (vm-set-summary-pointer (car vm-message-pointer))
! (setq vm-need-summary-pointer-update nil))))
(if (null vm-message-pointer)
()
(setq vm-ml-message-number (vm-number-of (car vm-message-pointer)))
--- 1019,1026 ----
(set-buffer-modified-p (buffer-modified-p))))
(defun vm-update-summary-and-mode-line ()
! (vm-do-needed-renumbering)
! (vm-do-needed-summary-rebuild)
(if (null vm-message-pointer)
()
(setq vm-ml-message-number (vm-number-of (car vm-message-pointer)))
***************
*** 1248,1253 ****
--- 1247,1253 ----
(setq mp (cdr mp)))
(if vm-message-list
(progn
+ (vm-do-needed-renumbering)
(vm-stuff-bookmark)
(vm-stuff-header-variables)
(and vm-retain-message-order
***************
*** 1310,1315 ****
--- 1310,1316 ----
;; stuff bookmark and header variable values
(if vm-message-list
(progn
+ (vm-do-needed-renumbering)
(vm-stuff-bookmark)
(vm-stuff-header-variables)
(and vm-retain-message-order
***************
*** 1391,1397 ****
visited folder."
(interactive
(save-excursion
! (vm-load-rc)
(vm-select-folder-buffer)
(let ((dir (if vm-folder-directory
(expand-file-name vm-folder-directory)
--- 1392,1398 ----
visited folder."
(interactive
(save-excursion
! (vm-session-initialization)
(vm-select-folder-buffer)
(let ((dir (if vm-folder-directory
(expand-file-name vm-folder-directory)
***************
*** 1403,1408 ****
--- 1404,1410 ----
(format " (default %s)" vm-last-save-folder)
""))
dir vm-last-save-folder t) current-prefix-arg))))
+ (vm-session-initialization)
(vm-select-folder-buffer)
(vm-check-for-killed-summary)
(vm folder read-only))
***************
*** 1635,1640 ****
--- 1637,1657 ----
(load "~/.vm" (not interactive) (not interactive) t))
(setq vm-rc-loaded t))
+ (defun vm-session-initialization ()
+ ;; If this is the first time VM has been run in this Emacs session,
+ ;; do some necessary preparations.
+ (if (or (not (boundp 'vm-session-beginning)) vm-session-beginning)
+ (progn
+ (random t)
+ (and (not (boundp 'vm-version)) (load "vm-version" nil t))
+ (and (not (boundp 'vm-session-beginning)) (load "vm-vars" nil t))
+ (vm-load-rc)
+ (and (not (commandp 'vm-next-message)) (load "vm-motion"))
+ (and (not (commandp 'vm-scroll-forward)) (load "vm-page"))
+ (and (not (commandp 'vm-undo)) (load "vm-undo"))
+ (and (not (commandp 'vm-summarize)) (load "vm-summary"))
+ (setq vm-session-beginning nil))))
+
(defun vm (&optional folder read-only)
"Read mail under Emacs.
Optional first arg FOLDER specifies the folder to visit. It defaults
***************
*** 1657,1672 ****
See the documentation for vm-mode for more information."
(interactive (list nil current-prefix-arg))
! ;; If this is the first time VM has been run in this Emacs session,
! ;; do some necessary preparations.
! (if vm-session-beginning
! (progn
! (random t)
! (vm-load-rc)
! (and (not (commandp 'vm-next-message)) (load "vm-motion"))
! (and (not (commandp 'vm-scroll-forward)) (load "vm-page"))
! (and (not (commandp 'vm-undo)) (load "vm-undo"))
! (and (not (commandp 'vm-summarize)) (load "vm-summary"))))
;; set inhibit-local-variables non-nil to protect
;; against letter bombs.
(let ((inhibit-local-variables t)
--- 1674,1680 ----
See the documentation for vm-mode for more information."
(interactive (list nil current-prefix-arg))
! (vm-session-initialization)
;; set inhibit-local-variables non-nil to protect
;; against letter bombs.
(let ((inhibit-local-variables t)
***************
*** 1694,1700 ****
(make-auto-save-file-name)
buffer-file-name)))
(inhibit-quit t)
! ototals)
;; If this is not a VM mode buffer then some initialization
;; needs to be done
(if first-time
--- 1702,1708 ----
(make-auto-save-file-name)
buffer-file-name)))
(inhibit-quit t)
! blurb)
;; If this is not a VM mode buffer then some initialization
;; needs to be done
(if first-time
***************
*** 1723,1754 ****
(null vm-message-list))
(progn
(vm-assimilate-new-messages)
- ;; Selecting the first message will change the new
- ;; or unread message count if previewing is
- ;; disabled. The user should get the count values
- ;; that were accurate before the first message was
- ;; selected. So we save those values now for later use.
- (setq ototals vm-totals)
;; Can't allow a folder-empty error here because execution
! ;; would abort before the session startup code below.
(if (null vm-message-list)
(and full-startup (message "Folder is empty."))
(if first-time
! (vm-check-header-variables))
! (set-buffer mail-buffer)
! (if first-time
! (vm-gobble-bookmark))
! (if first-time
! (vm-gobble-message-order))
! (vm-thoughtfully-select-message)
! (setq vm-totals ototals))))
(and full-startup
(progn (switch-to-buffer mail-buffer)
! (vm-emit-totals-blurb)))
(if (and full-startup vm-message-list vm-startup-with-summary)
(progn
(vm-summarize t)
! (vm-emit-totals-blurb)
(and (eq vm-startup-with-summary t)
(eq vm-mutable-windows t)
;; If we're not in the summary window go there
--- 1731,1755 ----
(null vm-message-list))
(progn
(vm-assimilate-new-messages)
;; Can't allow a folder-empty error here because execution
! ;; would abort before the code below.
(if (null vm-message-list)
(and full-startup (message "Folder is empty."))
(if first-time
! (progn
! (vm-check-header-variables)
! (vm-gobble-bookmark)
! (vm-gobble-message-order)))
! (setq blurb (vm-emit-totals-blurb))
! (vm-thoughtfully-select-message))))
(and full-startup
(progn (switch-to-buffer mail-buffer)
! (if (not blurb)
! (setq blurb (vm-emit-totals-blurb)))))
(if (and full-startup vm-message-list vm-startup-with-summary)
(progn
(vm-summarize t)
! (message blurb)
(and (eq vm-startup-with-summary t)
(eq vm-mutable-windows t)
;; If we're not in the summary window go there
***************
*** 1781,1803 ****
(message "Not checking for new mail... auto save file is newer; consider M-x recover-file")
(message "Auto save file is newer; consider M-x recover-file"))
(sit-for 3)))
- (if vm-session-beginning
- (progn
- (setq vm-session-beginning nil)
;; Display copyright and copying info unless
;; user says no.
! (if (and (not vm-inhibit-startup-message) full-startup)
! (progn
! (vm-display-startup-message)
! ;; If there are any messages, redisplay the totals blurb.
! ;; w.r.t the major mode check below: we won't be in the
! ;; summary buffer if there are no messages...
! ;; Forget it if we're not doing a full-startup.
! (if (and full-startup
! (or vm-message-list
! (eq major-mode 'vm-summary-mode))
! (not (input-pending-p)))
! (vm-emit-totals-blurb)))))))))
(defun vm-mode ()
"Major mode for reading mail.
--- 1782,1794 ----
(message "Not checking for new mail... auto save file is newer; consider M-x recover-file")
(message "Auto save file is newer; consider M-x recover-file"))
(sit-for 3)))
;; Display copyright and copying info unless
;; user says no.
! (if (and (not vm-inhibit-startup-message) full-startup)
! (progn
! (vm-display-startup-message)
! (if (not (input-pending-p))
! (message blurb)))))))
(defun vm-mode ()
"Major mode for reading mail.
***************
*** 1834,1839 ****
--- 1825,1832 ----
F - followup with included text from the current message
z - forward the current message
m - send a message
+ B - resend the current message to another user.
+ c - continue composing the most recent message you were composing
@ - digestify and mail entire folder contents (the folder is not modified)
* - burst a digest into individual messages, and append and assimilate these
***************
*** 1857,1873 ****
q - quit VM, deleted messages are expunged, folder saved to disk
x - exit VM with no change to the folder
! M - use marks; the next vm command will affect only marked messages
if it makes sense for the command to do so
! C-c C-@ - mark the current message
! C-c SPC - unmark the current message
! C-c C-a - mark all messsages
! C-c a - unmark all messsages
C-_ - undo, special undo that retracts the most recent
changes in message attributes. Expunges and saves
! cannot be undone.
L - reload your VM init file, ~/.vm
--- 1850,1867 ----
q - quit VM, deleted messages are expunged, folder saved to disk
x - exit VM with no change to the folder
! M N - use marks; the next vm command will affect only marked messages
if it makes sense for the command to do so
! M m - mark the current message
! M u - unmark the current message
! M M - mark all messsages
! M U - unmark all messsages
C-_ - undo, special undo that retracts the most recent
changes in message attributes. Expunges and saves
! cannot be undone. C-x u is also bound to this
! command.
L - reload your VM init file, ~/.vm
***************
*** 1959,1967 ****
(put 'vm-mode 'mode-class 'special)
- (and (not (boundp 'vm-version)) (load "vm-version" nil t))
- (and (not (boundp 'vm-session-beginning)) (load "vm-vars" nil t))
-
(autoload 'vm-visit-virtual-folder "vm-virtual" nil t)
(autoload 'vm-group-messages "vm-group" nil t)
--- 1953,1958 ----
***************
*** 1974,1981 ****
--- 1965,1974 ----
(autoload 'vm-followup-include-text "vm-reply" nil t)
(autoload 'vm-mail "vm-reply" nil t)
(autoload 'vm-resend-bounced-message "vm-reply" nil t)
+ (autoload 'vm-resend-message "vm-reply" nil t)
(autoload 'vm-forward-message "vm-reply" nil t)
(autoload 'vm-send-digest "vm-reply" nil t)
+ (autoload 'vm-continue-composing-message "vm-reply" nil t)
(autoload 'vm-follow-summary-cursor "vm-summary")
Technical Details
Message-ID:
<9103150315.AA14100@wendy-fate.UU.NET>Path:
arc1-ca.pugleaf.net!gmdzi!unido!mcsun!uunet!wendy-fate.uu.net!bug-vmShow Full Headers
Complete Article Headers
X-Google-Language: ENGLISH,ASCII-7-bit X-Google-Thread: f6829,8b4adc50134a2ac9,start X-Google-Attributes: gidf6829,public X-Google-ArrivalTime: 1991-03-14 23:24:39 PST Path: arc1-ca.pugleaf.net!gmdzi!unido!mcsun!uunet!wendy-fate.uu.net!bug-vm From: kyle@wendy-fate.uu.net (Kyle Jones) Newsgroups: gnu.emacs.vm.bug Subject: VM 5.26 -> 5.27 patch Message-ID: <9103150315.AA14100@wendy-fate.UU.NET> Date: 15 Mar 91 03:15:00 GMT Sender: bug-vm-request@uunet.uu.net Lines: 1147