First a compliment: nice mail reader, I use it every day.

Now one "bug" and a feature request.

*Problem.
I am using the FCC feature of emacs-mail to archive my outgoing messages.
If I want to send a mail, while reading the mailbox that stores my outgoing
messages, I get an error message:

Buffer is read-only: #<buffer mbox.out>

When I exit my vm-session with that mailbox, all works well.
Not sure if the problem is with mail or vm, but you're the experts...

*New feature.
Let me see the senders in the summary for incoming mail, and the recipients for outgoing mail.

I could not find any format specifier for this so I looked into the code.
Please find attached some code which redefines the function "vm-compile-format" (vm-summary.el).
The changes are minor: a format option "B" is added which works similar to "F" and "T".
If option "B" is chosen, the new function "vm-su-full-to-from-name" will be called (eventually).
This new function checks if the "from"-name equals the login name,
if it does "vm-su-to-names" is called, otherwise it calls "vm-su-full-name". 
This gives you the "T" behavior for incoming and the "F" behavior for outgoing.

Hope you find it useful.

Rgds, Frank.

_________________________________________________________________________________________________

; hack to make vm display the senders for incoming mail and the recipients for outgoing.
; introduces new format specifier B
; in .emacs, load this after vm and add:
; (setq vm-summary-format "%2n %*%a %-17.17B %-3.3m %2d %4l/%-5c \"%s\"\n")

(require 'vm)

; see if login name equals from-name, if so display recipients instead of senders.
(defun vm-su-full-to-from-name (m)
  (if (string-equal (user-login-name)
		    (or (vm-from-of m)
			(progn (vm-su-do-author m) (vm-from-of m))))
      (vm-su-to-names m)
    (vm-su-full-name m)))

; minor changes to original (vm-summary.el) 
; add "B" format specifier plus its handler
; 1 line changed and 3 lines added
(defun vm-compile-format (format-variable)
  (let ((format (symbol-value format-variable))
	sexp sexp-fmt conv-spec last-match-end case-fold-search)
    (store-match-data nil)
    (while (string-match
"%\\(-\\)?\\([0-9]\\)*\\(\\.\\([0-9]+\\)\\)?\\([aABcdfFhilmMnstTwyz*%]\\)"
	    format (match-end 0))
      (setq conv-spec (aref format (match-beginning 5)))
      (if (memq conv-spec '(?a ?A ?B ?c ?d ?f ?F ?h ?i ?l ?M  ;; added ?B here
			    ?m ?n ?s ?t ?T ?w ?y ?z ?*))
	  (progn
	    (cond ((= conv-spec ?a)
		   (setq sexp (cons (list 'vm-su-attribute-indicators
					  'vm-su-message) sexp)))
		  ((= conv-spec ?A)
		   (setq sexp (cons (list 'vm-su-attribute-indicators-long
					  'vm-su-message) sexp)))
		  ;; new option B
		  ((= conv-spec ?B)
		   (setq sexp (cons (list 'vm-su-full-to-from-name
					  'vm-su-message) sexp)))
		  ((= conv-spec ?c)
		   (setq sexp (cons (list 'vm-su-byte-count
					  'vm-su-message) sexp)))
		  ((= conv-spec ?d)
		   (setq sexp (cons (list 'vm-su-monthday
					  'vm-su-message) sexp)))
		  ((= conv-spec ?f)
		   (setq sexp (cons (list 'vm-su-from
					  'vm-su-message) sexp)))
		  ((= conv-spec ?F)
		   (setq sexp (cons (list 'vm-su-full-name
					  'vm-su-message) sexp)))
		  ((= conv-spec ?h)
		   (setq sexp (cons (list 'vm-su-hour
					  'vm-su-message) sexp)))
		  ((= conv-spec ?i)
		   (setq sexp (cons (list 'vm-su-message-id
					  'vm-su-message) sexp)))
		  ((= conv-spec ?l)
		   (setq sexp (cons (list 'vm-su-line-count
					  'vm-su-message) sexp)))
		  ((= conv-spec ?m)
		   (setq sexp (cons (list 'vm-su-month
					  'vm-su-message) sexp)))
		  ((= conv-spec ?M)
		   (setq sexp (cons (list 'vm-su-month-number
					  'vm-su-message) sexp)))
		  ((= conv-spec ?n)
		   (setq sexp (cons (list 'vm-su-message-number
					  'vm-su-message) sexp)))
		  ((= conv-spec ?s)
		   (setq sexp (cons (list 'vm-su-subject
					  'vm-su-message) sexp)))
		  ((= conv-spec ?T)
		   (setq sexp (cons (list 'vm-su-to-names
					  'vm-su-message) sexp)))
		  ((= conv-spec ?t)
		   (setq sexp (cons (list 'vm-su-to
					  'vm-su-message) sexp)))
		  ((= conv-spec ?w)
		   (setq sexp (cons (list 'vm-su-weekday
					  'vm-su-message) sexp)))
		  ((= conv-spec ?y)
		   (setq sexp (cons (list 'vm-su-year
					  'vm-su-message) sexp)))
		  ((= conv-spec ?z)
		   (setq sexp (cons (list 'vm-su-zone
					  'vm-su-message) sexp)))
		  ((= conv-spec ?*)
		   (setq sexp (cons (list 'vm-su-mark
					  'vm-su-message) sexp))))
	    (cond ((match-beginning 1)
		   (setcar sexp
			   (list 'vm-left-justify-string (car sexp)
				 (string-to-int (substring format
							   (match-beginning 2)
							   (match-end 2))))))
		  ((match-beginning 2)
		   (setcar sexp
			   (list 'vm-right-justify-string (car sexp)
				 (string-to-int (substring format
							   (match-beginning 2)
							   (match-end 2)))))))
	    (cond ((match-beginning 3)
		   (setcar sexp
			   (list 'vm-truncate-string (car sexp)
				 (string-to-int (substring format
							   (match-beginning 4)
							   (match-end 4)))))))
	    (setq sexp-fmt
		  (cons "%s"
			(cons (substring format
					 (or last-match-end 0)
					 (match-beginning 0))
			      sexp-fmt))))
	(setq sexp-fmt
	      (cons "%%"
		    (cons (substring format
				     (or last-match-end 0)
				     (match-beginning 0))
			  sexp-fmt))))
      (setq last-match-end (match-end 0)))
    (setq sexp-fmt 
	  (cons (substring format
			   (or last-match-end 0)
			   (length format))
		sexp-fmt)
	  sexp-fmt (apply 'concat (nreverse sexp-fmt))
	  sexp (cons 'format (cons sexp-fmt (nreverse sexp))))
    (put format-variable 'vm-format-sexp sexp)
    (put format-variable 'vm-compiled-format format)))

Newsgroups: gnu.emacs.vm.bug