2011-04-15 13:50:04 +00:00
|
|
|
|
;;; mailalias.el --- expand and complete mailing address aliases -*- lexical-binding: t -*-
|
1992-05-30 22:12:04 +00:00
|
|
|
|
|
2024-01-02 01:47:10 +00:00
|
|
|
|
;; Copyright (C) 1985, 1987, 1995-1997, 2001-2024 Free Software
|
2013-01-01 09:11:05 +00:00
|
|
|
|
;; Foundation, Inc.
|
1992-07-22 04:22:42 +00:00
|
|
|
|
|
2019-05-25 20:43:06 +00:00
|
|
|
|
;; Maintainer: emacs-devel@gnu.org
|
1992-07-17 08:15:29 +00:00
|
|
|
|
;; Keywords: mail
|
1992-07-16 21:47:34 +00:00
|
|
|
|
|
1990-03-06 16:45:37 +00:00
|
|
|
|
;; This file is part of GNU Emacs.
|
|
|
|
|
|
2008-05-06 07:25:26 +00:00
|
|
|
|
;; GNU Emacs is free software: you can redistribute it and/or modify
|
1990-03-06 16:45:37 +00:00
|
|
|
|
;; it under the terms of the GNU General Public License as published by
|
2008-05-06 07:25:26 +00:00
|
|
|
|
;; the Free Software Foundation, either version 3 of the License, or
|
|
|
|
|
;; (at your option) any later version.
|
1990-03-06 16:45:37 +00:00
|
|
|
|
|
|
|
|
|
;; GNU Emacs is distributed in the hope that it will be useful,
|
|
|
|
|
;; but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
|
;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
|
;; GNU General Public License for more details.
|
|
|
|
|
|
|
|
|
|
;; You should have received a copy of the GNU General Public License
|
2017-09-13 22:52:52 +00:00
|
|
|
|
;; along with GNU Emacs. If not, see <https://www.gnu.org/licenses/>.
|
1990-03-06 16:45:37 +00:00
|
|
|
|
|
1993-03-22 03:27:18 +00:00
|
|
|
|
;;; Commentary:
|
|
|
|
|
|
|
|
|
|
;; Basic functions for defining and expanding mail aliases.
|
|
|
|
|
;; These seal off the interface to the alias-definition parts of a
|
|
|
|
|
;; .mailrc file formatted for BSD's Mail or USL's mailx.
|
|
|
|
|
|
1992-07-16 21:47:34 +00:00
|
|
|
|
;;; Code:
|
1990-03-06 16:45:37 +00:00
|
|
|
|
|
1994-09-16 22:28:30 +00:00
|
|
|
|
(require 'sendmail)
|
1992-10-20 04:35:17 +00:00
|
|
|
|
|
1997-06-07 23:12:19 +00:00
|
|
|
|
(defgroup mailalias nil
|
2005-07-04 02:52:52 +00:00
|
|
|
|
"Expanding mail aliases."
|
1997-06-07 23:12:19 +00:00
|
|
|
|
:group 'mail)
|
1996-02-12 08:09:49 +00:00
|
|
|
|
|
1997-06-07 23:12:19 +00:00
|
|
|
|
(defcustom mail-passwd-files '("/etc/passwd")
|
2009-03-14 21:20:47 +00:00
|
|
|
|
"List of files from which to determine valid user names."
|
1997-06-07 23:12:19 +00:00
|
|
|
|
:type '(repeat string)
|
|
|
|
|
:group 'mailalias)
|
1997-03-22 03:49:14 +00:00
|
|
|
|
|
1997-06-07 23:12:19 +00:00
|
|
|
|
(defcustom mail-passwd-command nil
|
2009-03-14 21:20:47 +00:00
|
|
|
|
"Shell command to retrieve text to add to `/etc/passwd', or nil."
|
1997-06-07 23:12:19 +00:00
|
|
|
|
:type '(choice string (const nil))
|
|
|
|
|
:group 'mailalias)
|
1997-03-22 03:49:14 +00:00
|
|
|
|
|
1996-02-12 08:09:49 +00:00
|
|
|
|
(defvar mail-directory-names t
|
|
|
|
|
"Alist of mail address directory entries.
|
|
|
|
|
When t this still needs to be initialized.")
|
|
|
|
|
|
|
|
|
|
(defvar mail-address-field-regexp
|
2024-10-04 13:32:13 +00:00
|
|
|
|
"^\\(Resent-\\)?\\(To\\|From\\|Cc\\|Bcc\\|Reply-To\\|X-Debbugs-Cc\\):")
|
1996-02-12 08:09:49 +00:00
|
|
|
|
|
2019-06-15 14:53:52 +00:00
|
|
|
|
;; `pattern' is bound dynamically before evaluating the forms in
|
|
|
|
|
;; `mail-complete-alist' and may be part of user customizations of
|
|
|
|
|
;; that variable.
|
|
|
|
|
(with-suppressed-warnings ((lexical pattern))
|
|
|
|
|
(defvar pattern))
|
2011-04-15 13:50:04 +00:00
|
|
|
|
|
1997-06-07 23:12:19 +00:00
|
|
|
|
(defcustom mail-complete-alist
|
1998-04-24 20:17:35 +00:00
|
|
|
|
;; Don't refer to mail-address-field-regexp here;
|
|
|
|
|
;; that confuses some things such as cus-dep.el.
|
2024-10-04 13:32:13 +00:00
|
|
|
|
'(("^\\(Resent-\\)?\\(To\\|From\\|Cc\\|Bcc\\|Reply-To\\|X-Debbugs-Cc\\):"
|
2011-04-15 13:50:04 +00:00
|
|
|
|
. (mail-get-names pattern))
|
|
|
|
|
("Newsgroups:" . (if (boundp 'gnus-active-hashtb)
|
|
|
|
|
gnus-active-hashtb
|
|
|
|
|
(if (boundp news-group-article-assoc)
|
|
|
|
|
news-group-article-assoc)))
|
|
|
|
|
("Followup-To:" . (mail-sentto-newsgroups))
|
|
|
|
|
;;("Distribution:" ???)
|
|
|
|
|
)
|
2009-03-14 21:20:47 +00:00
|
|
|
|
"Alist of header field and expression to return alist for completion.
|
1997-06-07 23:12:19 +00:00
|
|
|
|
The expression may reference the variable `pattern'
|
Remove many items obsolete since 24.1
* lisp/allout.el (allout-abbreviate-flattened-numbering)
(allout-mode-deactivate-hook):
* lisp/ansi-color.el (ansi-color-unfontify-region):
* lisp/auth-source.el (auth-source-hide-passwords)
(auth-source-user-or-password)
(auth-source-forget-user-or-password):
* lisp/cedet/data-debug.el (data-debug-map):
* lisp/cedet/semantic/grammar.el (semantic-grammar-syntax-table)
(semantic-grammar-map):
* lisp/chistory.el (command-history-map):
* lisp/comint.el (comint-dynamic-complete)
(comint-dynamic-complete-as-filename)
(comint-dynamic-simple-complete):
* lisp/dired-x.el (read-filename-at-point)
(dired-x-submit-report):
* lisp/dos-fns.el (register-name-alist, make-register)
(register-value, set-register-value, intdos, mode25, mode4350):
* lisp/emacs-lisp/bytecomp.el (byte-compile-disable-print-circle):
* lisp/emacs-lisp/chart.el (chart-map):
* lisp/emacs-lisp/package.el (package-menu-view-commentary):
* lisp/emacs-lock.el (toggle-emacs-lock, emacs-lock-from-exiting):
* lisp/erc/erc.el (erc-complete-word):
* lisp/eshell/em-cmpl.el (eshell-cmpl-suffix-list):
* lisp/eshell/esh-util.el (eshell-for):
* lisp/files.el (inhibit-first-line-modes-regexps)
(inhibit-first-line-modes-suffixes):
* lisp/gnus/gnus-msg.el (gnus-outgoing-message-group)
(gnus-debug-files, gnus-debug-exclude-variables):
* lisp/gnus/gnus-registry.el (gnus-registry-user-format-function-M):
* lisp/gnus/gnus.el (gnus-local-domain, gnus-carpal):
* lisp/gnus/nnimap.el (nnimap-split-rule):
* lisp/iimage.el (turn-on-iimage-mode):
* lisp/image.el (image-extension-data, image-library-alist):
* lisp/mail/emacsbug.el (report-emacs-bug-pretest-address):
* lisp/mail/mail-utils.el (rmail-dont-reply-to):
* lisp/mail/mailalias.el (mail-complete-function)
(mail-completion-at-point-function):
* lisp/mail/rmail.el (rmail-dont-reply-to-names)
(rmail-default-dont-reply-to-names):
* lisp/mail/sendmail.el (mail-mailer-swallows-blank-line)
(mail-sent-via):
* lisp/menu-bar.el (menu-bar-kill-ring-save):
* lisp/minibuffer.el (completion-annotate-function)
(minibuffer-local-filename-must-match-map):
* lisp/msb.el (msb-after-load-hooks):
* lisp/obsolete/eieio-compat.el (eieio-defmethod)
(eieio-defgeneric):
* lisp/obsolete/info-edit.el (Info-edit-map):
* lisp/obsolete/starttls.el (starttls-any-program-available):
* lisp/progmodes/cfengine.el (cfengine-mode-abbrevs):
* lisp/progmodes/cwarn.el (turn-on-cwarn-mode):
* lisp/progmodes/make-mode.el (makefile-complete):
* lisp/progmodes/meta-mode.el (meta-complete-symbol)
(meta-mode-map):
* lisp/progmodes/pascal.el (pascal-toggle-completions)
(pascal-last-completions, pascal-show-completions):
* lisp/progmodes/prolog.el (prolog-char-quote-workaround):
* lisp/progmodes/which-func.el (which-func-mode): [FUNCTION]
* lisp/simple.el (count-lines-region, minibuffer-completing-symbol):
* lisp/speedbar.el (speedbar-syntax-table, speedbar-key-map):
* lisp/strokes.el (strokes-report-bug):
* lisp/subr.el (condition-case-no-debug):
* lisp/term/ns-win.el (ns-alternatives-map)
(ns-store-cut-buffer-internal):
* lisp/term/w32-win.el (w32-default-color-map):
* lisp/term/x-win.el (x-cut-buffer-or-selection-value):
* lisp/textmodes/bibtex.el (bibtex-complete)
(bibtex-entry-field-alist):
* lisp/textmodes/reftex-index.el (reftex-index-map)
(reftex-index-phrases-map):
* lisp/textmodes/reftex-sel.el (reftex-select-label-map)
(reftex-select-bib-map):
* lisp/textmodes/reftex-toc.el (reftex-toc-map):
* lisp/textmodes/rst.el (rst-block-face, rst-external-face)
(rst-definition-face, rst-directive-face, rst-comment-face)
(rst-emphasis1-face, rst-emphasis2-face, rst-literal-face)
(rst-reference-face):
* lisp/vc/vc-hooks.el (vc-toggle-read-only):
* lisp/view.el (view-return-to-alist)
(view-return-to-alist-update): Remove many functions and variables
obsolete since 24.1.
* lisp/textmodes/bibtex.el (bibtex-entry-alist): Don't use above
removed variable 'bibtex-entry-field-alist'.
* lisp/cedet/data-debug.el (data-debug-edebug-expr)
(data-debug-eval-expression):
* lisp/emacs-lisp/trace.el (trace--read-args):
* lisp/files-x.el (read-file-local-variable-value):
* lisp/simple.el (read--expression): Don't use above removed variable
'minibuffer-completing-symbol'.
* lisp/textmodes/rst.el (rst-font-lock-keywords): Don't use above
removed variables.
* src/w32fns.c (Fw32_default_color_map): Delete obsolete function.
(syms_of_w32fns): Delete defsubr for above defun.
* src/keyboard.c (syms_of_keyboard) <Vdeferred_action_list>
<Vdeferred_action_function>: Delete DEFVARs.
<Qdeferred_action_function>: Delete DEFSYM.
(syms_of_keyboard_for_pdumper): Adjust for above change.
(command_loop_1): Don't run deferred-action-function hook.
* lisp/subr.el (deferred-action-list, deferred-action-function):
Delete obsoletion statements.
* lisp/emacs-lisp/ert-x.el (ert-simulate-command): Don't run
'deferred-action-list' hook.
* doc/lispref/hooks.texi (Standard Hooks): Delete
'deferred-action-function'.
* lisp/emacs-lisp/lisp.el (field-complete):
* lisp/eshell/em-cmpl.el (eshell-cmpl-initialize):
* lisp/gnus/gnus-msg.el (gnus-inews-insert-gcc):
* lisp/gnus/nnmail.el (nnmail-fancy-expiry-target):
* lisp/mail/mail-utils.el (mail-dont-reply-to):
* lisp/mail/sendmail.el (sendmail-send-it):
* lisp/mail/smtpmail.el (smtpmail-send-it):
* lisp/minibuffer.el (minibuffer-completion-help):
* lisp/progmodes/python.el: Don't use above removed items.
* lisp/emacs-lisp/eieio-core.el:
* lisp/mail/mailalias.el (mail-complete-alist): Doc fixes; don't refer
to above removed items.
; * etc/NEWS: List removed items.
2021-12-03 22:17:04 +00:00
|
|
|
|
which will hold the string being completed."
|
1999-01-25 09:45:02 +00:00
|
|
|
|
:type 'alist
|
2022-07-11 08:33:45 +00:00
|
|
|
|
:risky t
|
1997-06-07 23:12:19 +00:00
|
|
|
|
:group 'mailalias)
|
1996-02-12 08:09:49 +00:00
|
|
|
|
|
1997-04-05 21:57:48 +00:00
|
|
|
|
;;;###autoload
|
1997-06-07 23:12:19 +00:00
|
|
|
|
(defcustom mail-complete-style 'angles
|
2009-03-14 21:20:47 +00:00
|
|
|
|
"Specifies how \\[mail-complete] formats the full name when it completes.
|
2015-05-21 17:04:45 +00:00
|
|
|
|
If nil, they contain just the return address like:
|
1997-04-05 21:57:48 +00:00
|
|
|
|
king@grassland.com
|
|
|
|
|
If `parens', they look like:
|
|
|
|
|
king@grassland.com (Elvis Parsley)
|
|
|
|
|
If `angles', they look like:
|
1997-06-07 23:12:19 +00:00
|
|
|
|
Elvis Parsley <king@grassland.com>"
|
|
|
|
|
:type '(choice (const angles) (const parens) (const nil))
|
|
|
|
|
:group 'mailalias)
|
1996-02-12 08:09:49 +00:00
|
|
|
|
|
1997-06-07 23:12:19 +00:00
|
|
|
|
(defcustom mail-directory-function nil
|
2009-03-14 21:20:47 +00:00
|
|
|
|
"Function to get completions from directory service or nil for none.
|
1997-06-07 23:12:19 +00:00
|
|
|
|
See `mail-directory-requery'."
|
|
|
|
|
:type '(choice function (const nil))
|
|
|
|
|
:group 'mailalias)
|
1996-02-12 08:09:49 +00:00
|
|
|
|
|
|
|
|
|
;; This is for when the directory is huge, or changes frequently.
|
1997-06-07 23:12:19 +00:00
|
|
|
|
(defcustom mail-directory-requery nil
|
2009-03-14 21:20:47 +00:00
|
|
|
|
"When non-nil call `mail-directory-function' for each completion.
|
1996-02-12 08:09:49 +00:00
|
|
|
|
In that case, one argument gets passed to the function, the partial string
|
1997-06-07 23:12:19 +00:00
|
|
|
|
entered so far."
|
|
|
|
|
:type 'boolean
|
|
|
|
|
:group 'mailalias)
|
1996-02-12 08:09:49 +00:00
|
|
|
|
|
1997-06-07 23:12:19 +00:00
|
|
|
|
(defcustom mail-directory-process nil
|
2009-03-14 21:20:47 +00:00
|
|
|
|
"Shell command to get the list of names from a mail directory.
|
1997-06-07 23:12:19 +00:00
|
|
|
|
This value is used when the value of `mail-directory-function'
|
|
|
|
|
is `mail-directory-process'. The value should be a list
|
|
|
|
|
of the form (COMMAND ARG ...), where each of the list elements
|
2005-03-26 02:13:35 +00:00
|
|
|
|
is evaluated. COMMAND should evaluate to a string. When
|
|
|
|
|
`mail-directory-requery' is non-nil, during evaluation of these
|
|
|
|
|
elements, the variable `pattern' contains the partial input being
|
|
|
|
|
completed. `pattern' is nil when `mail-directory-requery' is nil.
|
1996-02-12 08:09:49 +00:00
|
|
|
|
|
1997-06-07 23:12:19 +00:00
|
|
|
|
The value might look like this:
|
1996-02-12 08:09:49 +00:00
|
|
|
|
|
2015-09-03 22:31:12 +00:00
|
|
|
|
(remote-shell-program \"HOST\" \"-nl\" \"USER\" \"COMMAND\")
|
1996-02-12 08:09:49 +00:00
|
|
|
|
|
1997-06-07 23:12:19 +00:00
|
|
|
|
or like this:
|
1996-02-12 08:09:49 +00:00
|
|
|
|
|
2015-09-03 22:31:12 +00:00
|
|
|
|
(remote-shell-program \"HOST\" \"-n\" \"COMMAND \\='^\" pattern \"\\='\")"
|
1997-06-07 23:12:19 +00:00
|
|
|
|
:type 'sexp
|
2022-07-11 08:33:45 +00:00
|
|
|
|
:risky t
|
1997-06-07 23:12:19 +00:00
|
|
|
|
:group 'mailalias)
|
1996-02-12 08:09:49 +00:00
|
|
|
|
|
1997-06-07 23:12:19 +00:00
|
|
|
|
(defcustom mail-directory-stream nil
|
2009-03-14 21:20:47 +00:00
|
|
|
|
"List of (HOST SERVICE) for stream connection to mail directory."
|
2016-01-30 19:48:18 +00:00
|
|
|
|
:type '(choice (const nil)
|
|
|
|
|
(list (string :tag "Host name or ip address")
|
|
|
|
|
(choice (integer :tag "Service port number")
|
|
|
|
|
(string :tag "Service name"))
|
|
|
|
|
(plist :inline t
|
|
|
|
|
:tag "Additional open-network-stream parameters")))
|
2022-07-11 08:33:45 +00:00
|
|
|
|
:risky t
|
1997-06-07 23:12:19 +00:00
|
|
|
|
:group 'mailalias)
|
1996-02-12 08:09:49 +00:00
|
|
|
|
|
1997-06-07 23:12:19 +00:00
|
|
|
|
(defcustom mail-directory-parser nil
|
2009-03-14 21:20:47 +00:00
|
|
|
|
"How to interpret the output of `mail-directory-function'.
|
1996-02-12 08:09:49 +00:00
|
|
|
|
Three types of values are possible:
|
|
|
|
|
|
|
|
|
|
- nil means to gather each line as one name
|
|
|
|
|
- regexp means first \\(grouping\\) in successive matches is name
|
1997-06-07 23:12:19 +00:00
|
|
|
|
- function called at beginning of buffer that returns an alist of names"
|
1997-06-08 20:50:45 +00:00
|
|
|
|
:type '(choice (const nil) regexp function)
|
2022-07-11 08:33:45 +00:00
|
|
|
|
:risky t
|
1997-06-07 23:12:19 +00:00
|
|
|
|
:group 'mailalias)
|
1996-02-12 08:09:49 +00:00
|
|
|
|
|
1997-06-07 23:12:19 +00:00
|
|
|
|
;; Internal variables.
|
|
|
|
|
|
|
|
|
|
(defvar mail-names t
|
|
|
|
|
"Alist of local users, aliases and directory entries as available.
|
|
|
|
|
Elements have the form (MAILNAME) or (MAILNAME . FULLNAME).
|
|
|
|
|
If the value means t, it means the real value should be calculated
|
2005-03-26 02:13:35 +00:00
|
|
|
|
for the next use. This is used in `mail-complete'.")
|
1997-06-07 23:12:19 +00:00
|
|
|
|
|
|
|
|
|
(defvar mail-local-names t
|
|
|
|
|
"Alist of local users.
|
|
|
|
|
When t this still needs to be initialized.")
|
|
|
|
|
|
1996-02-12 08:09:49 +00:00
|
|
|
|
|
1990-03-06 16:45:37 +00:00
|
|
|
|
;; Called from sendmail-send-it, or similar functions,
|
|
|
|
|
;; only if some mail aliases are defined.
|
1997-05-14 07:27:25 +00:00
|
|
|
|
;;;###autoload
|
1990-03-06 16:45:37 +00:00
|
|
|
|
(defun expand-mail-aliases (beg end &optional exclude)
|
|
|
|
|
"Expand all mail aliases in suitable header fields found between BEG and END.
|
1998-04-30 06:27:58 +00:00
|
|
|
|
If interactive, expand in header fields.
|
2018-05-20 17:47:32 +00:00
|
|
|
|
Suitable header fields are `To', `From', `Cc' and `Bcc', `Reply-To', and
|
1995-05-19 18:57:17 +00:00
|
|
|
|
their `Resent-' variants.
|
|
|
|
|
|
1991-04-01 21:16:55 +00:00
|
|
|
|
Optional second arg EXCLUDE may be a regular expression defining text to be
|
|
|
|
|
removed from alias expansions."
|
1997-05-14 07:27:25 +00:00
|
|
|
|
(interactive
|
|
|
|
|
(save-excursion
|
|
|
|
|
(list (goto-char (point-min))
|
1998-04-30 06:27:58 +00:00
|
|
|
|
(mail-header-end))))
|
1996-01-05 21:41:55 +00:00
|
|
|
|
(sendmail-sync-aliases)
|
1997-05-14 07:27:25 +00:00
|
|
|
|
(when (eq mail-aliases t)
|
|
|
|
|
(setq mail-aliases nil)
|
|
|
|
|
(build-mail-aliases))
|
|
|
|
|
(save-excursion
|
|
|
|
|
(goto-char beg)
|
|
|
|
|
(setq end (set-marker (make-marker) end))
|
|
|
|
|
(let ((case-fold-search nil))
|
|
|
|
|
(while (let ((case-fold-search t))
|
|
|
|
|
(re-search-forward mail-address-field-regexp end t))
|
|
|
|
|
(skip-chars-forward " \t")
|
|
|
|
|
(let ((beg1 (point))
|
|
|
|
|
end1 pos epos seplen
|
|
|
|
|
;; DISABLED-ALIASES records aliases temporarily disabled
|
|
|
|
|
;; while we scan text that resulted from expanding those aliases.
|
|
|
|
|
;; Each element is (ALIAS . TILL-WHEN), where TILL-WHEN
|
|
|
|
|
;; is where to reenable the alias (expressed as number of chars
|
|
|
|
|
;; counting from END1).
|
|
|
|
|
(disabled-aliases nil))
|
|
|
|
|
(re-search-forward "^[^ \t]" end 'move)
|
|
|
|
|
(beginning-of-line)
|
|
|
|
|
(skip-chars-backward " \t\n")
|
|
|
|
|
(setq end1 (point-marker))
|
|
|
|
|
(goto-char beg1)
|
|
|
|
|
(while (< (point) end1)
|
|
|
|
|
(setq pos (point))
|
|
|
|
|
;; Reenable any aliases which were disabled for ranges
|
|
|
|
|
;; that we have passed out of.
|
|
|
|
|
(while (and disabled-aliases
|
|
|
|
|
(> pos (- end1 (cdr (car disabled-aliases)))))
|
|
|
|
|
(setq disabled-aliases (cdr disabled-aliases)))
|
|
|
|
|
;; EPOS gets position of end of next name;
|
|
|
|
|
;; SEPLEN gets length of whitespace&separator that follows it.
|
|
|
|
|
(if (re-search-forward "[ \t]*[\n,][ \t]*" end1 t)
|
|
|
|
|
(setq epos (match-beginning 0)
|
|
|
|
|
seplen (- (point) epos))
|
2013-07-19 13:09:03 +00:00
|
|
|
|
;; Handle the last name in this header field.
|
|
|
|
|
;; We already moved END1 back across whitespace after it.
|
|
|
|
|
(setq epos (marker-position end1) seplen 0))
|
1997-05-14 07:27:25 +00:00
|
|
|
|
(let ((string (buffer-substring-no-properties pos epos))
|
|
|
|
|
translation)
|
|
|
|
|
(if (and (not (assoc string disabled-aliases))
|
|
|
|
|
(setq translation (cdr (assoc string mail-aliases))))
|
|
|
|
|
(progn
|
|
|
|
|
;; This name is an alias. Disable it.
|
|
|
|
|
(setq disabled-aliases (cons (cons string (- end1 epos))
|
|
|
|
|
disabled-aliases))
|
|
|
|
|
;; Replace the alias with its expansion
|
|
|
|
|
;; then rescan the expansion for more aliases.
|
|
|
|
|
(goto-char pos)
|
|
|
|
|
(insert translation)
|
|
|
|
|
(when exclude
|
|
|
|
|
(let ((regexp (concat "\\b\\(" exclude "\\)\\b"))
|
1990-03-06 16:45:37 +00:00
|
|
|
|
(end (point-marker)))
|
|
|
|
|
(goto-char pos)
|
|
|
|
|
(while (re-search-forward regexp end t)
|
|
|
|
|
(replace-match ""))
|
|
|
|
|
(goto-char end)))
|
1997-05-14 07:27:25 +00:00
|
|
|
|
(delete-region (point) (+ (point) (- epos pos)))
|
|
|
|
|
(goto-char pos))
|
|
|
|
|
;; Name is not an alias. Skip to start of next name.
|
|
|
|
|
(goto-char epos)
|
|
|
|
|
(forward-char seplen))))
|
|
|
|
|
(set-marker end1 nil)))
|
|
|
|
|
(set-marker end nil))))
|
1990-03-06 16:45:37 +00:00
|
|
|
|
|
1995-01-03 23:43:47 +00:00
|
|
|
|
;; Called by mail-setup, or similar functions, only if the file specified
|
|
|
|
|
;; by mail-personal-alias-file (usually `~/.mailrc') exists.
|
1990-03-06 16:45:37 +00:00
|
|
|
|
(defun build-mail-aliases (&optional file)
|
1995-01-03 23:43:47 +00:00
|
|
|
|
"Read mail aliases from personal aliases file and set `mail-aliases'.
|
|
|
|
|
By default, this is the file specified by `mail-personal-alias-file'."
|
2010-12-14 04:42:59 +00:00
|
|
|
|
(interactive
|
|
|
|
|
(list
|
Use `format-prompt' when prompting with default values
* lisp/woman.el (woman-file-name):
* lisp/wid-edit.el (widget-file-prompt-value)
(widget-coding-system-prompt-value):
* lisp/w32-fns.el (w32-set-system-coding-system):
* lisp/vc/vc.el (vc-print-root-log):
* lisp/vc/vc-annotate.el (vc-annotate):
* lisp/vc/emerge.el (emerge-read-file-name):
* lisp/vc/ediff.el (ediff-directories)
(ediff-directory-revisions, ediff-directories3)
(ediff-merge-directories, )
(ediff-merge-directories-with-ancestor)
(ediff-merge-directory-revisions)
(ediff-merge-directory-revisions-with-ancestor)
(ediff-merge-revisions, ediff-merge-revisions-with-ancestor)
(ediff-revision):
* lisp/vc/ediff-util.el (ediff-toggle-regexp-match):
* lisp/vc/ediff-mult.el (ediff-filegroup-action):
* lisp/vc/add-log.el (prompt-for-change-log-name):
* lisp/textmodes/table.el (table-insert-row-column)
(table-span-cell, table-split-cell-horizontally)
(table-split-cell, table-justify, table-generate-source)
(table-insert-sequence, table-capture)
(table--read-from-minibuffer, table--query-justification):
* lisp/textmodes/sgml-mode.el (sgml-tag, sgml-tag-help):
* lisp/textmodes/reftex-ref.el (reftex-goto-label):
* lisp/textmodes/refer.el (refer-get-bib-files):
* lisp/textmodes/css-mode.el (css-lookup-symbol):
* lisp/term.el (serial-read-name, serial-read-speed):
* lisp/speedbar.el (speedbar-change-initial-expansion-list):
* lisp/simple.el (previous-matching-history-element)
(set-variable):
* lisp/ses.el (ses-read-cell, ses-set-column-width):
* lisp/replace.el (query-replace-read-from)
(occur-read-primary-args):
* lisp/rect.el (string-rectangle, string-insert-rectangle):
* lisp/progmodes/tcl.el (tcl-help-on-word):
* lisp/progmodes/sh-script.el (sh-set-shell):
* lisp/progmodes/python.el (python-eldoc-at-point):
* lisp/progmodes/octave.el (octave-completing-read)
(octave-update-function-file-comment, octave-insert-defun):
* lisp/progmodes/inf-lisp.el (lisp-symprompt):
* lisp/progmodes/cperl-mode.el (cperl-info-on-command)
(cperl-perldoc):
* lisp/progmodes/compile.el (compilation-find-file):
* lisp/net/rcirc.el (rcirc-prompt-for-encryption):
* lisp/net/eww.el (eww):
* lisp/net/browse-url.el (browse-url-with-browser-kind):
* lisp/man.el (man):
* lisp/mail/sendmail.el (sendmail-query-user-about-smtp):
* lisp/mail/mailalias.el (build-mail-aliases):
* lisp/mail/mailabbrev.el (merge-mail-abbrevs)
(rebuild-mail-abbrevs):
* lisp/locate.el (locate-prompt-for-search-string):
* lisp/isearch.el (isearch-occur):
* lisp/international/ogonek.el (ogonek-read-encoding)
(ogonek-read-prefix):
* lisp/international/mule.el (read-buffer-file-coding-system)
(set-terminal-coding-system, set-keyboard-coding-system)
(set-next-selection-coding-system, recode-region):
* lisp/international/mule-cmds.el ()
(universal-coding-system-argument, search-unencodable-char)
(select-safe-coding-system-interactively):
* lisp/info.el (Info-search, Info-search-backward, Info-menu):
* lisp/info-look.el (info-lookup-interactive-arguments):
* lisp/imenu.el (imenu--completion-buffer):
* lisp/ibuf-ext.el (mode, used-mode, ibuffer-mark-by-mode):
* lisp/hi-lock.el (hi-lock-unface-buffer)
(hi-lock-read-face-name):
* lisp/help.el (view-emacs-news, where-is):
* lisp/help-fns.el (describe-variable, describe-symbol)
(describe-keymap):
* lisp/gnus/mm-decode.el (mm-save-part):
* lisp/gnus/gnus-sum.el (gnus-summary-browse-url):
* lisp/gnus/gnus-group.el (gnus-group--read-bug-ids)
(gnus-group-set-current-level):
* lisp/frame.el (make-frame-on-monitor)
(close-display-connection, select-frame-by-name):
* lisp/format.el (format-encode-buffer, format-encode-region):
* lisp/files.el (recode-file-name):
* lisp/files-x.el (read-file-local-variable)
(read-file-local-variable-value, )
(read-file-local-variable-mode):
* lisp/ffap.el (ffap-menu-ask):
* lisp/faces.el (face-read-string):
* lisp/facemenu.el (facemenu-set-charset):
* lisp/erc/erc-dcc.el (erc-dcc-do-GET-command):
* lisp/emulation/edt-mapper.el (edt-mapper):
* lisp/emacs-lisp/trace.el (trace--read-args)
(trace-function-foreground, trace-function-background):
* lisp/emacs-lisp/smie.el (smie-config-set-indent):
* lisp/emacs-lisp/re-builder.el (reb-change-syntax):
* lisp/emacs-lisp/package.el (describe-package):
* lisp/emacs-lisp/find-func.el (read-library-name)
(find-function-read):
* lisp/emacs-lisp/ert.el (ert-read-test-name)
(ert-run-tests-interactively):
* lisp/emacs-lisp/disass.el (disassemble):
* lisp/emacs-lisp/debug.el (debug-on-entry)
(debug-on-variable-change):
* lisp/emacs-lisp/advice.el (ad-read-advised-function)
(ad-read-advice-class, ad-read-advice-name, ad-read-regexp):
* lisp/dired-x.el (dired--mark-suffix-interactive-spec):
* lisp/dired-aux.el (dired-diff):
* lisp/cus-edit.el (custom-variable-prompt, customize-mode)
(customize-changed-options):
* lisp/completion.el (interactive-completion-string-reader):
* lisp/calendar/timeclock.el (timeclock-ask-for-project):
* lisp/calc/calcalg3.el (calc-get-fit-variables):
* lisp/calc/calc-store.el (calc-edit-variable):
* lisp/calc/calc-bin.el (calc-word-size):
* lisp/bookmark.el (bookmark-set-internal):
* lisp/abbrev.el (read-abbrev-file): Use `format-prompt' for
prompting (bug#12443).
2020-09-06 14:56:44 +00:00
|
|
|
|
(read-file-name
|
|
|
|
|
(format-prompt "Read mail alias file" mail-personal-alias-file)
|
|
|
|
|
nil mail-personal-alias-file t)))
|
1995-01-03 23:43:47 +00:00
|
|
|
|
(setq file (expand-file-name (or file mail-personal-alias-file)))
|
1998-02-01 23:56:13 +00:00
|
|
|
|
;; In case mail-aliases is t, make sure define-mail-alias
|
|
|
|
|
;; does not recursively call build-mail-aliases.
|
|
|
|
|
(setq mail-aliases nil)
|
2009-08-27 18:32:37 +00:00
|
|
|
|
(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))
|
1990-03-06 16:45:37 +00:00
|
|
|
|
|
|
|
|
|
;; Always autoloadable in case the user wants to define aliases
|
|
|
|
|
;; interactively or in .emacs.
|
2008-11-25 22:58:14 +00:00
|
|
|
|
;; define-mail-abbrev in mailabbrev.el duplicates much of this code.
|
1991-05-09 21:50:34 +00:00
|
|
|
|
;;;###autoload
|
1994-06-19 19:52:02 +00:00
|
|
|
|
(defun define-mail-alias (name definition &optional from-mailrc-file)
|
1991-04-01 21:16:55 +00:00
|
|
|
|
"Define NAME as a mail alias that translates to DEFINITION.
|
1990-03-06 16:45:37 +00:00
|
|
|
|
This means that sending a message to NAME will actually send to DEFINITION.
|
1995-06-30 20:27:28 +00:00
|
|
|
|
|
|
|
|
|
Normally, the addresses in DEFINITION must be separated by commas.
|
2003-02-04 13:24:35 +00:00
|
|
|
|
If FROM-MAILRC-FILE is non-nil, then addresses in DEFINITION
|
1995-06-30 20:27:28 +00:00
|
|
|
|
can be separated by spaces; an address can contain spaces
|
|
|
|
|
if it is quoted with double-quotes."
|
|
|
|
|
|
1990-03-06 16:45:37 +00:00
|
|
|
|
(interactive "sDefine mail alias: \nsDefine %s as mail alias for: ")
|
|
|
|
|
;; Read the defaults first, if we have not done so.
|
1998-02-01 23:56:13 +00:00
|
|
|
|
;; But not if we are doing that already right now.
|
|
|
|
|
(unless from-mailrc-file
|
|
|
|
|
(sendmail-sync-aliases))
|
1990-03-06 16:45:37 +00:00
|
|
|
|
(if (eq mail-aliases t)
|
|
|
|
|
(progn
|
|
|
|
|
(setq mail-aliases nil)
|
1995-01-03 23:43:47 +00:00
|
|
|
|
(if (file-exists-p mail-personal-alias-file)
|
1990-03-06 16:45:37 +00:00
|
|
|
|
(build-mail-aliases))))
|
1993-06-15 20:51:15 +00:00
|
|
|
|
;; strip garbage from front and end
|
|
|
|
|
(if (string-match "\\`[ \t\n,]+" definition)
|
1991-12-21 09:14:03 +00:00
|
|
|
|
(setq definition (substring definition (match-end 0))))
|
1993-06-15 20:51:15 +00:00
|
|
|
|
(if (string-match "[ \t\n,]+\\'" definition)
|
1991-12-21 09:14:03 +00:00
|
|
|
|
(setq definition (substring definition 0 (match-beginning 0))))
|
2008-11-25 22:58:14 +00:00
|
|
|
|
|
|
|
|
|
(let* ((L (length definition))
|
|
|
|
|
(start (if (> L 0) 0))
|
|
|
|
|
end this-entry result tem)
|
1994-06-19 19:52:02 +00:00
|
|
|
|
(while start
|
2008-11-25 22:58:14 +00:00
|
|
|
|
(cond
|
|
|
|
|
(from-mailrc-file
|
|
|
|
|
;; If we're reading from the mailrc file, addresses are
|
|
|
|
|
;; delimited by spaces, and addresses with embedded spaces are
|
|
|
|
|
;; surrounded by non-escaped double-quotes.
|
|
|
|
|
(if (eq ?\" (aref definition start))
|
|
|
|
|
(setq start (1+ start)
|
|
|
|
|
end (and (string-match
|
|
|
|
|
"[^\\]\\(\\([\\][\\]\\)*\\)\"[ \t,]*"
|
|
|
|
|
definition start)
|
|
|
|
|
(match-end 1)))
|
|
|
|
|
(setq end (string-match "[ \t,]+" definition start)))
|
|
|
|
|
;; Extract the address and advance the loop past it.
|
|
|
|
|
(setq this-entry (substring definition start end)
|
|
|
|
|
start (and end (/= (match-end 0) L) (match-end 0)))
|
|
|
|
|
;; If the full name contains a problem character, quote it.
|
|
|
|
|
(and (string-match "\\(.+?\\)[ \t]*\\(<.*>\\)" this-entry)
|
|
|
|
|
(string-match "[^- !#$%&'*+/0-9=?A-Za-z^_`{|}~]"
|
|
|
|
|
(match-string 1 this-entry))
|
|
|
|
|
(setq this-entry (replace-regexp-in-string
|
|
|
|
|
"\\(.+?\\)[ \t]*\\(<.*>\\)"
|
|
|
|
|
"\"\\1\" \\2"
|
|
|
|
|
this-entry))))
|
|
|
|
|
;; When we are not reading from .mailrc, addresses are
|
|
|
|
|
;; separated by commas. Try to accept a rfc822-like syntax.
|
|
|
|
|
;; (Todo: extend rfc822.el to do the work for us.)
|
|
|
|
|
((equal (string-match
|
|
|
|
|
"[ \t,]*\\(\"\\(?:[^\"]\\|[^\\]\\(?:[\\][\\]\\)*\"\\)*\"[ \t]*\
|
|
|
|
|
<[-.!#$%&'*+/0-9=?A-Za-z^_`{|}~@]+>\\)[ \t,]*"
|
|
|
|
|
definition start)
|
|
|
|
|
start)
|
|
|
|
|
;; If an entry has a valid [ "foo bar" <foo@example.com> ]
|
|
|
|
|
;; form, use it literally . This also allows commas in the
|
|
|
|
|
;; quoted string, e.g. [ "foo bar, jr" <foo@example.com> ]
|
|
|
|
|
(setq this-entry (match-string 1 definition)
|
|
|
|
|
start (and (/= (match-end 0) L) (match-end 0))))
|
|
|
|
|
(t
|
|
|
|
|
;; Otherwise, read the next address by looking for a comma.
|
|
|
|
|
(setq end (string-match "[ \t\n,]*,[ \t\n]*" definition start))
|
|
|
|
|
(setq this-entry (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.
|
|
|
|
|
(and (string-match "\\(.+?\\)[ \t]*\\(<.*>\\)" this-entry)
|
|
|
|
|
(string-match "[^- !#$%&'*+/0-9=?A-Za-z^_`{|}~]"
|
|
|
|
|
(match-string 1 this-entry))
|
|
|
|
|
(setq this-entry (replace-regexp-in-string
|
|
|
|
|
"\\(.+?\\)[ \t]*\\(<.*>\\)" "\"\\1\" \\2"
|
|
|
|
|
this-entry)))))
|
|
|
|
|
(push this-entry result))
|
|
|
|
|
|
1994-06-19 19:52:02 +00:00
|
|
|
|
(setq definition (mapconcat (function identity)
|
2008-11-25 22:58:14 +00:00
|
|
|
|
(nreverse result) ", "))
|
1990-03-06 16:45:37 +00:00
|
|
|
|
(setq tem (assoc name mail-aliases))
|
|
|
|
|
(if tem
|
|
|
|
|
(rplacd tem definition)
|
1996-02-12 08:09:49 +00:00
|
|
|
|
(setq mail-aliases (cons (cons name definition) mail-aliases)
|
|
|
|
|
mail-names t))))
|
|
|
|
|
|
1996-02-26 01:32:31 +00:00
|
|
|
|
;;;###autoload
|
2011-04-15 13:50:04 +00:00
|
|
|
|
(defun mail-completion-at-point-function ()
|
|
|
|
|
"Compute completion data for mail aliases.
|
|
|
|
|
For use on `completion-at-point-functions'."
|
1996-06-24 09:50:09 +00:00
|
|
|
|
;; Read the defaults first, if we have not done so.
|
|
|
|
|
(sendmail-sync-aliases)
|
|
|
|
|
(if (eq mail-aliases t)
|
|
|
|
|
(progn
|
|
|
|
|
(setq mail-aliases nil)
|
|
|
|
|
(if (file-exists-p mail-personal-alias-file)
|
|
|
|
|
(build-mail-aliases))))
|
2011-04-15 13:50:04 +00:00
|
|
|
|
(let ((list mail-complete-alist)
|
|
|
|
|
(list-exp nil))
|
1998-06-26 06:04:56 +00:00
|
|
|
|
(if (and (< 0 (mail-header-end))
|
1996-02-12 08:09:49 +00:00
|
|
|
|
(save-excursion
|
2011-04-15 13:50:04 +00:00
|
|
|
|
(if (re-search-backward "^[^\t ]" nil t)
|
1996-02-12 08:09:49 +00:00
|
|
|
|
(while list
|
|
|
|
|
(if (looking-at (car (car list)))
|
2011-04-15 13:50:04 +00:00
|
|
|
|
(setq list-exp (cdr (car list))
|
1996-02-12 08:09:49 +00:00
|
|
|
|
list ())
|
|
|
|
|
(setq list (cdr list)))))
|
2011-04-15 13:50:04 +00:00
|
|
|
|
list-exp))
|
1996-02-12 08:09:49 +00:00
|
|
|
|
(let* ((end (point))
|
|
|
|
|
(beg (save-excursion
|
|
|
|
|
(skip-chars-backward "^ \t<,:")
|
|
|
|
|
(point)))
|
2011-04-15 13:50:04 +00:00
|
|
|
|
(table (completion-table-dynamic
|
|
|
|
|
(lambda (prefix)
|
|
|
|
|
(let ((pattern prefix)) (eval list-exp))))))
|
|
|
|
|
(list beg end table)))))
|
1996-02-12 08:09:49 +00:00
|
|
|
|
|
2011-04-15 13:50:04 +00:00
|
|
|
|
(defun mail-completion-expand (table)
|
|
|
|
|
"Build new completion table that expands aliases.
|
|
|
|
|
Completes like TABLE except that if the completion is a valid alias,
|
|
|
|
|
it expands it to its full `mail-complete-style' form."
|
|
|
|
|
(lambda (string pred action)
|
|
|
|
|
(cond
|
|
|
|
|
((eq action nil)
|
|
|
|
|
(let* ((comp (try-completion string table pred))
|
|
|
|
|
(name (and (listp table) comp
|
|
|
|
|
(assoc (if (stringp comp) comp string) table))))
|
|
|
|
|
(cond
|
|
|
|
|
((null name) comp)
|
|
|
|
|
((eq mail-complete-style 'parens)
|
|
|
|
|
(concat (car name) " (" (cdr name) ")"))
|
|
|
|
|
((eq mail-complete-style 'angles)
|
|
|
|
|
(concat (cdr name) " <" (car name) ">"))
|
|
|
|
|
(t comp))))
|
|
|
|
|
(t
|
|
|
|
|
(complete-with-action action table string pred)))))
|
|
|
|
|
|
|
|
|
|
(defun mail-get-names (prefix)
|
1997-04-05 21:57:48 +00:00
|
|
|
|
"Fetch local users and global mail addresses for completion.
|
1996-02-12 08:09:49 +00:00
|
|
|
|
Consults `/etc/passwd' and a directory service if one is set up via
|
1997-04-05 21:57:48 +00:00
|
|
|
|
`mail-directory-function'.
|
2011-04-15 13:50:04 +00:00
|
|
|
|
PREFIX is the string we want to complete."
|
1996-02-12 08:09:49 +00:00
|
|
|
|
(if (eq mail-local-names t)
|
2009-08-27 18:32:37 +00:00
|
|
|
|
(with-current-buffer (generate-new-buffer " passwd")
|
1997-03-22 03:49:14 +00:00
|
|
|
|
(let ((files mail-passwd-files))
|
|
|
|
|
(while files
|
|
|
|
|
(insert-file-contents (car files) nil nil nil t)
|
|
|
|
|
(setq files (cdr files))))
|
|
|
|
|
(if mail-passwd-command
|
|
|
|
|
(call-process shell-file-name nil t nil
|
|
|
|
|
shell-command-switch mail-passwd-command))
|
2005-05-22 13:43:55 +00:00
|
|
|
|
(goto-char (point-min))
|
1997-03-22 03:49:14 +00:00
|
|
|
|
(setq mail-local-names nil)
|
1996-02-12 08:09:49 +00:00
|
|
|
|
(while (not (eobp))
|
1996-03-09 08:03:15 +00:00
|
|
|
|
;;Recognize lines like
|
|
|
|
|
;; nobody:*:65534:65534::/:
|
|
|
|
|
;; +demo::::::/bin/csh
|
|
|
|
|
;; +ethanb
|
|
|
|
|
;;while skipping
|
|
|
|
|
;; +@SOFTWARE
|
1997-04-05 21:57:48 +00:00
|
|
|
|
;; The second \(...\) matches the user id.
|
|
|
|
|
(if (looking-at "\\+?\\([^:@\n+]+\\):[^:\n]*:\\([^\n:]*\\):")
|
|
|
|
|
(add-to-list 'mail-local-names
|
|
|
|
|
(cons (match-string 1)
|
|
|
|
|
(user-full-name
|
2005-05-16 11:34:49 +00:00
|
|
|
|
(string-to-number (match-string 2))))))
|
1996-02-12 08:09:49 +00:00
|
|
|
|
(beginning-of-line 2))
|
|
|
|
|
(kill-buffer (current-buffer))))
|
|
|
|
|
(if (or (eq mail-names t)
|
1997-04-05 21:57:48 +00:00
|
|
|
|
(eq mail-directory-names t))
|
1996-02-12 08:09:49 +00:00
|
|
|
|
(let (directory)
|
|
|
|
|
(and mail-directory-function
|
|
|
|
|
(eq mail-directory-names t)
|
|
|
|
|
(setq directory
|
2011-04-15 13:50:04 +00:00
|
|
|
|
(mail-directory (if mail-directory-requery prefix))))
|
1997-04-05 21:57:48 +00:00
|
|
|
|
(or mail-directory-requery
|
|
|
|
|
(setq mail-directory-names directory))
|
1996-02-12 08:09:49 +00:00
|
|
|
|
(if (or directory
|
|
|
|
|
(eq mail-names t))
|
|
|
|
|
(setq mail-names
|
1997-04-05 21:57:48 +00:00
|
|
|
|
(sort (append (if (consp mail-aliases)
|
|
|
|
|
(mapcar
|
2020-09-30 14:18:50 +00:00
|
|
|
|
(lambda (a) (list (car a)))
|
1997-04-05 21:57:48 +00:00
|
|
|
|
mail-aliases))
|
1996-02-12 08:09:49 +00:00
|
|
|
|
(if (consp mail-local-names)
|
|
|
|
|
mail-local-names)
|
2015-09-03 22:31:12 +00:00
|
|
|
|
(or directory
|
2005-03-26 02:13:35 +00:00
|
|
|
|
(when (consp mail-directory-names)
|
|
|
|
|
mail-directory-names)))
|
1996-02-12 08:09:49 +00:00
|
|
|
|
(lambda (a b)
|
2011-04-15 13:50:04 +00:00
|
|
|
|
;; Should cache downcased strings.
|
1996-02-12 08:09:49 +00:00
|
|
|
|
(string< (downcase (car a))
|
1997-04-05 21:57:48 +00:00
|
|
|
|
(downcase (car b)))))))))
|
2011-04-15 13:50:04 +00:00
|
|
|
|
(mail-completion-expand mail-names))
|
1996-02-12 08:09:49 +00:00
|
|
|
|
|
|
|
|
|
|
2011-04-15 13:50:04 +00:00
|
|
|
|
(defun mail-directory (prefix)
|
|
|
|
|
"Use mail-directory facility to get user names matching PREFIX.
|
|
|
|
|
If PREFIX is nil, get all the defined user names.
|
2005-03-26 02:13:35 +00:00
|
|
|
|
This function calls `mail-directory-function' to query the directory,
|
|
|
|
|
then uses `mail-directory-parser' to parse the output it returns."
|
2009-08-27 18:32:37 +00:00
|
|
|
|
(message "Querying directory...")
|
|
|
|
|
(with-current-buffer (generate-new-buffer " *mail-directory*")
|
2011-04-15 13:50:04 +00:00
|
|
|
|
(funcall mail-directory-function prefix)
|
2009-08-27 18:32:37 +00:00
|
|
|
|
(goto-char (point-min))
|
1996-02-12 08:09:49 +00:00
|
|
|
|
(let (directory)
|
|
|
|
|
(if (stringp mail-directory-parser)
|
|
|
|
|
(while (re-search-forward mail-directory-parser nil t)
|
2011-04-15 13:50:04 +00:00
|
|
|
|
(push (match-string 1) directory))
|
1996-02-12 08:09:49 +00:00
|
|
|
|
(if mail-directory-parser
|
|
|
|
|
(setq directory (funcall mail-directory-parser))
|
|
|
|
|
(while (not (eobp))
|
2011-04-15 13:50:04 +00:00
|
|
|
|
(push (buffer-substring (point)
|
|
|
|
|
(progn
|
|
|
|
|
(forward-line)
|
|
|
|
|
(if (bolp)
|
|
|
|
|
(1- (point))
|
|
|
|
|
(point))))
|
|
|
|
|
directory))))
|
1996-02-12 08:09:49 +00:00
|
|
|
|
(kill-buffer (current-buffer))
|
|
|
|
|
(message "Querying directory...done")
|
|
|
|
|
directory)))
|
|
|
|
|
|
2011-04-15 13:50:04 +00:00
|
|
|
|
(defvar mailalias-done)
|
1996-02-12 08:09:49 +00:00
|
|
|
|
|
2011-04-15 13:50:04 +00:00
|
|
|
|
(defun mail-directory-process (prefix)
|
1997-06-07 23:12:19 +00:00
|
|
|
|
"Run a shell command to output names in directory.
|
1996-02-12 08:09:49 +00:00
|
|
|
|
See `mail-directory-process'."
|
2005-03-26 02:13:35 +00:00
|
|
|
|
(when (consp mail-directory-process)
|
2011-04-15 13:50:04 +00:00
|
|
|
|
(let ((pattern prefix)) ;Dynbind!
|
|
|
|
|
(apply 'call-process (eval (car mail-directory-process)) nil t nil
|
|
|
|
|
(mapcar 'eval (cdr mail-directory-process))))))
|
1996-02-12 08:09:49 +00:00
|
|
|
|
|
|
|
|
|
;; This should handle a dialog. Currently expects port to spit out names.
|
2011-04-15 13:50:04 +00:00
|
|
|
|
(defun mail-directory-stream (prefix)
|
1996-02-12 08:09:49 +00:00
|
|
|
|
"Open a stream to retrieve names in directory.
|
|
|
|
|
See `mail-directory-stream'."
|
2011-04-15 13:50:04 +00:00
|
|
|
|
(let ((mailalias-done nil)
|
|
|
|
|
(pattern prefix)) ;Dynbind!
|
1996-02-12 08:09:49 +00:00
|
|
|
|
(set-process-sentinel
|
|
|
|
|
(apply 'open-network-stream "mailalias" (current-buffer)
|
|
|
|
|
mail-directory-stream)
|
2011-04-15 13:50:04 +00:00
|
|
|
|
(lambda (_x _y)
|
1996-02-12 08:09:49 +00:00
|
|
|
|
(setq mailalias-done t)))
|
|
|
|
|
(while (not mailalias-done)
|
|
|
|
|
(sit-for .1))))
|
|
|
|
|
|
|
|
|
|
(defun mail-sentto-newsgroups ()
|
|
|
|
|
"Return all entries from Newsgroups: header as completion alist."
|
|
|
|
|
(save-excursion
|
|
|
|
|
(if (mail-position-on-field "newsgroups" t)
|
|
|
|
|
(let ((point (point))
|
|
|
|
|
list)
|
|
|
|
|
(while (< (skip-chars-backward "^:, \t\n") 0)
|
|
|
|
|
(setq list `((,(buffer-substring (point) point))
|
|
|
|
|
,@list))
|
|
|
|
|
(skip-chars-backward ", \t\n")
|
|
|
|
|
(setq point (point)))
|
|
|
|
|
list))))
|
1992-05-30 22:12:04 +00:00
|
|
|
|
|
1992-08-04 04:15:43 +00:00
|
|
|
|
(provide 'mailalias)
|
|
|
|
|
|
1992-05-30 22:12:04 +00:00
|
|
|
|
;;; mailalias.el ends here
|