;;; mailabbrev.el --- abbrev-expansion of mail aliases
-;; Copyright (C) 1985, 86, 87, 92, 93, 96, 1997, 2000, 2002
-;; Free Software Foundation, Inc.
+;; Copyright (C) 1985, 1986, 1987, 1992, 1993, 1996, 1997, 2000, 2002,
+;; 2003, 2004, 2005 Free Software Foundation, Inc.
;; Author: Jamie Zawinski <jwz@lucid.com>, now <jwz@jwz.org>
;; Maintainer: FSF
;; You should have received a copy of the GNU General Public License
;; along with GNU Emacs; see the file COPYING. If not, write to the
-;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-;; Boston, MA 02111-1307, USA.
+;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+;; Boston, MA 02110-1301, USA.
;;; Commentary:
;; This file ensures that, when the point is in a To:, CC:, BCC:, or From:
;; field, word-abbrevs are defined for each of your mail aliases. These
;; aliases will be defined from your .mailrc file (or the file specified by
-;; the MAILRC environment variable) if it exists. Your mail aliases will
+;; `mail-personal-alias-file') if it exists. Your mail aliases will
;; expand any time you type a word-delimiter at the end of an abbreviation.
;;
;; What you see is what you get: if mailabbrev is in use when you type
;; Your mail alias abbrevs will be in effect only when the point is in an
;; appropriate header field. When in the body of the message, or other
;; header fields, the mail aliases will not expand. Rather, the normal
-;; mode-specific abbrev table (mail-mode-abbrev-table) will be used if
+;; mode-specific abbrev table will be used if
;; defined. So if you use mail-mode specific abbrevs, this code will not
;; adversely affect you. You can control which header fields the abbrevs
;; are used in by changing the variable mail-abbrev-mode-regexp.
;; (add-hook
;; 'mail-mode-hook
;; (lambda ()
-;; (substitute-key-definition 'next-line 'mail-abbrev-next-line
-;; mail-mode-map global-map)
-;; (substitute-key-definition 'end-of-buffer 'mail-abbrev-end-of-buffer
-;; mail-mode-map global-map)))
+;; (define-key mail-mode-map [remap next-line] 'mail-abbrev-next-line)
+;; (define-key mail-mode-map [remap end-of-buffer] 'mail-abbrev-end-of-buffer)))
;;
;; If you want multiple addresses separated by a string other than ", " then
;; you can set the variable mail-alias-separator-string to it. This has to
"The modification time of your mail alias file when it was last examined.")
(defun mail-abbrevs-sync-aliases ()
- (if (file-exists-p mail-personal-alias-file)
- (let ((modtime (nth 5 (file-attributes mail-personal-alias-file))))
- (if (not (equal mail-abbrev-modtime modtime))
- (progn
- (setq mail-abbrev-modtime modtime)
- (build-mail-abbrevs))))))
+ (when mail-personal-alias-file
+ (if (file-exists-p mail-personal-alias-file)
+ (let ((modtime (nth 5 (file-attributes mail-personal-alias-file))))
+ (if (not (equal mail-abbrev-modtime modtime))
+ (progn
+ (setq mail-abbrev-modtime modtime)
+ (build-mail-abbrevs)))))))
;;;###autoload
(defun mail-abbrevs-setup ()
end (string-match "\"[ \t,]*" definition start))
(setq end (string-match "[ \t,]+" definition start)))
(setq end (string-match "[ \t\n,]*,[ \t\n,]*" definition start)))
- (setq result (cons (substring definition start end) result))
- (setq start (and end
- (/= (match-end 0) L)
- (match-end 0))))
+ (let ((tem (substring definition start end)))
+ ;; Advance the loop past this address.
+ (setq start (and end
+ (/= (match-end 0) L)
+ (match-end 0)))
+ ;; If the full name contains a problem character, quote it.
+ (when (string-match "\\(.+?\\)[ \t]*\\(<.*>\\)" tem)
+ (if (string-match "[^- !#$%&'*+/0-9=?A-Za-z^_`{|}~]"
+ (match-string 1 tem))
+ (setq tem (replace-regexp-in-string
+ "\\(.+?\\)[ \t]*\\(<.*>\\)" "\"\\1\" \\2"
+ tem))))
+ (push tem result)))
(setq definition (mapconcat (function identity)
(nreverse result)
mail-alias-separator-string)))
(defun mail-abbrev-make-syntax-table ()
(make-local-variable 'mail-abbrev-syntax-table)
(unless mail-abbrev-syntax-table
- (let ((tab (copy-syntax-table old-syntax-table))
+ (let ((tab (copy-syntax-table (syntax-table)))
(_ (aref (standard-syntax-table) ?_))
(w (aref (standard-syntax-table) ?w)))
(map-char-table
(function (lambda (key value)
+ (if (null value)
+ ;; Fetch the inherited value
+ (setq value (aref tab key)))
(if (equal value _)
(set-char-table-range tab key w))))
tab)
(modify-syntax-entry ?@ "w" tab)
+ (modify-syntax-entry ?% "w" tab)
+ (modify-syntax-entry ?! "w" tab)
+ (modify-syntax-entry ?. "w" tab)
+ (modify-syntax-entry ?_ "w" tab)
+ (modify-syntax-entry ?- "w" tab)
(setq mail-abbrev-syntax-table tab))))
(defun mail-abbrev-in-expansion-header-p ()
(rfc822-goto-eoh)
(point)))))))
-(defvar mail-mode-abbrev-table) ; quiet the compiler
-
(defun sendmail-pre-abbrev-expand-hook ()
(and (and mail-abbrevs (not (eq mail-abbrevs t)))
(if (mail-abbrev-in-expansion-header-p)
;; the usual syntax table.
(or (and (integerp last-command-char)
- (eq (char-syntax last-command-char) ?_))
+ (or (eq (char-syntax last-command-char) ?_)
+ ;; Don't expand on @.
+ (memq last-command-char '(?@ ?. ?% ?! ?_ ?-))))
(let ((pre-abbrev-expand-hook nil)) ; That's us; don't loop.
;; Use this table so that abbrevs can have hyphens in them.
(set-syntax-table mail-abbrev-syntax-table)
(interactive "P")
(if (looking-at "[ \t]*\n") (expand-abbrev))
(setq this-command 'end-of-buffer)
- (end-of-buffer arg))
+ (with-no-warnings
+ (end-of-buffer arg)))
(eval-after-load "sendmail"
'(progn
(if mail-abbrevs-mode
(mail-abbrevs-enable))
+;;; arch-tag: 5aa2d901-73f8-4ad7-b73c-4802282ad2ff
;;; mailabbrev.el ends here