Function: build-mail-aliases

build-mail-aliases is an autoloaded, interactive and byte-compiled function defined in mailalias.el.gz.

Signature

(build-mail-aliases &optional FILE)

Documentation

Read mail aliases from personal aliases file and set mail-aliases.

By default, this is the file specified by mail-personal-alias-file.

Key Bindings

Source Code

;; Defined in /usr/src/emacs/lisp/mail/mailalias.el.gz
;; Called by mail-setup, or similar functions, only if the file specified
;; by mail-personal-alias-file (usually `~/.mailrc') exists.
(defun build-mail-aliases (&optional file)
  "Read mail aliases from personal aliases file and set `mail-aliases'.
By default, this is the file specified by `mail-personal-alias-file'."
  (interactive
   (list
    (read-file-name
     (format-prompt "Read mail alias file" mail-personal-alias-file)
     nil mail-personal-alias-file t)))
  (setq file (expand-file-name (or file mail-personal-alias-file)))
  ;; In case mail-aliases is t, make sure define-mail-alias
  ;; does not recursively call build-mail-aliases.
  (setq mail-aliases nil)
  (with-temp-buffer
    (while file
      (cond ((get-file-buffer file)
             (insert (with-current-buffer (get-file-buffer file)
                       (buffer-substring-no-properties
                        (point-min) (point-max)))))
            ((file-exists-p file) (insert-file-contents file))
            ((file-exists-p (setq file (expand-file-name file "~/")))
             (insert-file-contents file))
            (t (setq file nil)))
      (goto-char (point-min))
      ;; Delete comments from the contents.
      (while (search-forward "# " nil t)
        (let ((p (- (point) 2)))
          (end-of-line)
          (delete-region p (point))))
      ;; Don't lose if no final newline.
      (goto-char (point-max))
      (or (eq (preceding-char) ?\n) (newline))
      (goto-char (point-min))
      ;; handle "\\\n" continuation lines
      (while (not (eobp))
        (end-of-line)
        (if (= (preceding-char) ?\\)
            (progn (delete-char -1) (delete-char 1) (insert ?\ ))
          (forward-char 1)))
      (goto-char (point-min))
      ;; handle `source' directives -- Eddy/1994/May/25
      (cond ((re-search-forward "^source[ \t]+" nil t)
             (re-search-forward "\\S-+")
             (setq file (buffer-substring-no-properties
                         (match-beginning 0) (match-end 0)))
             (beginning-of-line)
             (insert "# ")   ; to ensure we don't re-process this file
             (beginning-of-line))
            (t (setq file nil))))
    (goto-char (point-min))
    (while (re-search-forward
            "^\\(a\\|alias\\|g\\|group\\)[ \t]+\\([^ \t\n]+\\)" nil t)
      (let* ((name (match-string 2))
             (start (progn (skip-chars-forward " \t") (point)))
             value)
        (end-of-line)
        (setq value (buffer-substring-no-properties start (point)))
        (unless (equal value "")
          (define-mail-alias name value t))))
    mail-aliases))