home *** CD-ROM | disk | FTP | other *** search
/ NetNews Usenet Archive 1992 #16 / NN_1992_16.iso / spool / comp / emacs / 2669 < prev    next >
Encoding:
Text File  |  1992-07-22  |  4.7 KB  |  166 lines

  1. Newsgroups: comp.emacs
  2. Path: sparky!uunet!mcsun!sun4nl!rulway.LeidenUniv.nl!rulfsw!desmedt
  3. From: desmedt@rulfsw.leidenuniv.nl
  4. Subject: search and insert e-mail address
  5. Message-ID: <1992Jul22.112549.1@rulfsw.leidenuniv.nl>
  6. Lines: 154
  7. Sender: news@rulway.LeidenUniv.nl (Usenet news account)
  8. Nntp-Posting-Host: rulfsw
  9. Organization: Leiden University Faculty of Social Sciences
  10. Date: 22 Jul 92 11:25:49 +0100
  11.  
  12. I have written a small package to search an e-mail address and insert
  13. it into a mail buffer.
  14.  
  15. It works in a simple but effective way.  You write the name to be
  16. looked for in the To: field, then press C-C C-A, and a menu buffer
  17. will appear with all addresses that match the name.  You can move
  18. through the menu buffer and select one, which then replaces what was
  19. the To: field.
  20.  
  21. This package presupposes the existence of a data file that has, on
  22. each line, a name, followed by one or more tabs, followed by an e-mail
  23. address.
  24.  
  25. Enjoy and send comments.
  26.  
  27. Koenraad de Smedt
  28. Leiden University
  29. -----------------------------------------------------
  30.  
  31. ;;; insert-address
  32.  
  33. ;;; inserts address in To: field of a mail buffer.
  34. ;;; gets search string from "To: " field, if none prompts user.
  35. ;;; uses agrep to search in datafile.
  36. ;;; (K. de Smedt, June 1992)
  37.  
  38. (defvar address-file-list (list "/usr/users/desmedt/data/net.data"))
  39.  
  40. (defvar address-search-command "/usr/local/bin/agrep")
  41.  
  42. (defvar address-search-options (list "-h" "-i"))
  43.  
  44. (defvar address-mode-map nil "Local keymap for mail address buffers.")
  45.  
  46. (if address-mode-map
  47.     nil
  48.   (setq address-mode-map (make-keymap))
  49.   (suppress-keymap address-mode-map t)
  50.   (define-key address-mode-map "y" 'pick-address)
  51.   (define-key address-mode-map "Y" 'pick-address)
  52.   (define-key address-mode-map "n" 'next-address)
  53.   (define-key address-mode-map "N" 'next-address)
  54.   (define-key address-mode-map " " 'next-address)
  55.   (define-key address-mode-map "p" 'previous-address)
  56.   (define-key address-mode-map "P" 'previous-address)
  57.   (define-key address-mode-map "q" 'abort-address)
  58.   (define-key address-mode-map "Q" 'abort-address)
  59.   (define-key address-mode-map "\r" 'abort-address))
  60.  
  61. (put 'address-mode 'mode-class 'special)
  62.  
  63. (defun address-mode ()
  64.   "Mode for choosing a mail address.
  65. Type y to pick an address.
  66. Type n to move to next address.
  67. Type q to quit."
  68.   (interactive)
  69.   (kill-all-local-variables)
  70.   (setq major-mode 'address-mode)
  71.   (setq mode-name "Choose Address")
  72.   (setq buffer-read-only t)
  73.   (use-local-map address-mode-map))
  74.  
  75. (defun insert-address ()
  76.   "Find and insert address in mail buffer"
  77.   (interactive)
  78.   (save-excursion
  79.     (mail-to)                ;move to To: field
  80.     (let ((eol (point)))
  81.       (beginning-of-line)
  82.       (search-forward "To: ")
  83.       (let ((name
  84.          (if (or (= (point) eol)
  85.              (bolp))        ;nothing in To: field?
  86.          (read-string "To: ")
  87.            (buffer-substring (point) eol))))
  88.     (let ((old-buffer (current-buffer))
  89.           (address
  90.            (choose-address name)))    ;choose address
  91.       (if address            ;insert if found
  92.           (progn (switch-to-buffer old-buffer)
  93.              (beginning-of-line)
  94.              (kill-line)
  95.              (insert "To: ")
  96.              (insert address))
  97.         (message "No addresses found")))))))
  98.  
  99. (defun choose-address (name)
  100.   "Find possible addresses for a name, choose one."
  101.   (interactive "sName: ")
  102.   (let ((buffer "Mail address list"))
  103.     (switch-to-buffer buffer)        ;pop-to-buffer?
  104.     (setq buffer-read-only nil)
  105.     (erase-buffer)
  106.     (apply 'call-process
  107.        (append
  108.         (list address-search-command ;process command
  109.           nil            ;input
  110.           buffer               ;buffer
  111.           t)            ;redisplay?
  112.         address-search-options    ;command options
  113.         (list name)            ;arg: search string
  114.         address-file-list))        ;args: file names
  115.     (if (bobp)                ;empty?
  116.     (progn (kill-buffer (current-buffer))
  117.            nil)
  118.       (progn
  119.     (beginning-of-buffer)
  120.     (address-mode)
  121.     (message "y=yes, n=next, q=quit")
  122.     (recursive-edit)
  123.     (get-register 'address)
  124.     ))))
  125.  
  126. ;;; the user commands
  127.  
  128. (defun pick-address ()
  129.   "Extract the address from a line containing
  130. last-name, first-names (comment)TABSaddress (comment)"
  131.   (interactive)
  132.   (end-of-line)
  133.   (search-backward "\t")
  134.   (forward-char)
  135.   (let ((begin (point)))
  136.     (re-search-forward "[ \n\\(]")    ;look for comment or eol
  137.     (backward-char)
  138.     (set-register 'address (buffer-substring begin (point)))
  139.     (kill-buffer (current-buffer))
  140.     (exit-recursive-edit)))
  141.     
  142. (defun next-address ()
  143.   "Go to next line."
  144.   (interactive)
  145.   (forward-line)
  146.   (beginning-of-line)
  147.   (if (eobp) (beginning-of-buffer)))
  148.  
  149. (defun previous-address ()
  150.   "Go to previous line."
  151.   (interactive)
  152.   (if (bobp)
  153.       (end-of-buffer))
  154.   (forward-line -1))
  155.  
  156. (defun abort-address ()
  157.   "Abort selection."
  158.   (interactive)
  159.   (set-register 'address nil)
  160.   (kill-buffer (current-buffer))
  161.   (abort-recursive-edit)
  162.   nil)
  163.  
  164. (if mail-mode-map
  165.     (define-key mail-mode-map "\C-c\C-a" 'insert-address))
  166.