🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: gnu.emacs.vm.bug
Article #9676

VM 5.26 -> 5.27 patch

#9676
From: Kyle Jones
Date: Fri, 15 Mar 1991 03:15
1147 lines
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-vm

Show 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