view miscellany/mhe/mh-mode.ml @ 0:bce86c4163a3

Initial revision
author kono
date Mon, 18 Apr 2005 23:46:02 +0900
parents
children
line wrap: on
line source

; This file implements a "mail draft mode" for composition of messages in
; the MH mail handler (q.v.). When MH calls Emacs, its customary call
;  is
; 	emacs ./reply ./message -lmh-mode -email-draft-mode
;  for the case of a reply, and
; 	emacs ./draft -lmh-mode -email-draft-mode
;  for a newly originated message. 
; 
; For use from mhe, in which Emacs calls MH instead of vice versa, it will
; work fine as long as the function mail-draft-mode is not called.
; 
; 	Brian Reid, December 1981

(defun
    (dot-in-header wasdot	; return True iff cursor in message hdr
	(save-excursion
	    (setq wasdot (dot))
	    (beginning-of-file)
	    (re-search-forward "^-*$")
	    (beginning-of-line) (backward-character)
	    (>= (dot) wasdot)
	)
    )
    (header-line-position	; position cursor w.r.t. header line
	(if (dot-in-header)
	    (progn 
		   (if (save-excursion 
			   (beginning-of-line)
			   (& (!= (following-char) ' ')
			      (!= (following-char) '\t'))
		       )
		       (progn (beginning-of-line)
			      (error-occured (search-forward ":"))
			      (if (eolp) 
				  (insert-character ' ')
				  (progn
					(forward-character)
					(if (! (eolp))
					    (progn
						  (forward-word)
						  (backward-word))
					))))
		   )))
    )
    
    (header-next		; modified ^N command.
	(next-line)
	(header-line-position)
    )
    
    (header-previous		; modified ^P command
	(previous-line)
	(header-line-position)
    )
    
    (find-starting-line		; back cursor up to first line of this para.
	(beginning-of-line)
	(while (& (! (bobp))
		  (! (eolp))
		  (!= (following-char) '	')
		  (! (looking-at "^-*$"))
	       )
	       (previous-line)
	)
	(next-line)
    )
    (justify-mail-paragraph	;  like ordinary justify-para, but
	(error-occured		; avoids trashing mail header.
	    (if (! (dot-in-header))
		(progn 
		       (save-excursion
			   (find-starting-line)
			   (if (& (! (eolp)) (! (eobp)))
			       (progn 
				      (set-mark)
				      (forward-paragraph)
				      (backward-word) (forward-word)
				      (forward-character)
				      (narrow-region)
				      (error-occured (justify-mail-region))
				      (widen-region))
			   )
		       )
		       (message "Done!")
		       (novalue)
		)))
    )
    
    (justify-mail-region	; justify the entire buffer
	(beginning-of-file)
	(delete-white-space)
	(to-col left-margin)
	(while (progn	; Turn it all into 1 long line....
		   (end-of-line)
		   (if (! (eobp))
		       (forward-character))
		   (! (eobp))
	       )
	       (delete-previous-character)
	       (delete-white-space)
	       (insert-string " ")
	)
	(beginning-of-line)
	(while (save-excursion 
		   (end-of-line)
		   (> (current-column) right-margin)
	       )
	       (goto-character (+ (dot) right-margin))
	       (forward-character) (backward-word)
	       (while (progn 
			     (backward-character)
			     (& (!= (following-char) ' ')
				(!= (following-char) '\t')
				(!= (following-char) '\n')
				(! (bobp)))
		      )
		      (novalue)
	       )
	       (delete-next-character) (newline)
	)
    )
)

(defun 
    (mail-mode
	(set "right-margin" 72)
	(local-bind-to-key "header-next" '')
	(local-bind-to-key "header-previous" '')
	(local-bind-to-key "justify-mail-paragraph" "\ej")
	(use-syntax-table "text-mode")
	(setq mode-string "mh-mail")
	(novalue)
    )
    
    (mail-draft-mode
	(if (> (argc) 4)
	    (progn 
		   (visit-file (argv 1))
		   (mail-mode)
		   (visit-file (argv 2))
		   (mail-mode)
		   (visit-file (argv 1))
		   (end-of-file)
	    )
	    (progn 
		   (visit-file (argv 1))
		   (mail-mode)
		   (beginning-of-file)
		   (header-line-position)
	    )
	)
    )
)