auto-completeとbbdbでメールのアドレス補完する

欲しくなったから書いてみた。

必要なもの

使い方

  • 設定のとこに書いてるようにどこかに書いておく。
  • EmacsMUAでメール書いてるときにTo:とかのとこで何かいれる。
  • こんな風になる。

設定

  • MUAにあわせてbbdbを使えるようにしとく。
  • MUAにあわせてac-bbdbを設定しとく。wlならこんな感じ。
(defun wl-draft-turn-on-ac ()
  (setq ac-sources '(ac-source-bbdb))
  (auto-complete-mode 1))

(add-hook 'wl-draft-mode-hook 'wl-draft-turn-on-ac))
  • 以下をどっかに書いとく
(defvar ac-bbdb-header-list '("to" "from" "cc" "bcc"))

(defun ac-bbdb-candidate ()
  (delete-dups
   (apply
    'append
    (mapcar (lambda (rec)
              (mapcar (lambda (n) (bbdb-dwim-net-address rec n))
                      (bbdb-record-net rec)))
            (bbdb-records)))))

(defun ac-bbdb-prefix ()
  (interactive)
  (let ((case-fold-search t))
    (when (and
           (< (point)
              (save-excursion
                (goto-char (point-min))
                (search-forward (concat "\n" mail-header-separator "\n") nil t)
                (point)))
           (save-excursion
             (beginning-of-line)
             (while (and (looking-at "^[ \t]")
                         (not (= (point) (point-min))))
               (forward-line -1))
             (looking-at (concat (regexp-opt ac-bbdb-header-list t) ":"))))
      (ac-prefix-symbol))))

(defvar ac-source-bbdb
  '((candidates . ac-bbdb-candidate)
    (match . substring)
    (prefix . ac-bbdb-prefix)))