X-Git-Url: https://code.delx.au/gnu-emacs-elpa/blobdiff_plain/fab3d049295d052bebf409e84bc4ac69800e190d..7d0db9ea6232b0167d9d437fc72a9ee16a028747:/company-bbdb.el diff --git a/company-bbdb.el b/company-bbdb.el index 4e7fdda60..36307d0bc 100644 --- a/company-bbdb.el +++ b/company-bbdb.el @@ -1,6 +1,6 @@ -;;; company-bbdb.el --- A company-mode completion back-end for BBDB in message-mode +;;; company-bbdb.el --- company-mode completion backend for BBDB in message-mode -;; Copyright (C) 2013-2014 Free Software Foundation, Inc. +;; Copyright (C) 2013-2014, 2016 Free Software Foundation, Inc. ;; Author: Jan Tatarik @@ -20,34 +20,42 @@ ;; along with GNU Emacs. If not, see . (require 'company) -(eval-when-compile (require 'cl)) -(require 'bbdb nil t) -(require 'bbdb-com nil t) +(require 'cl-lib) -(defvar company-bbdb-records (make-hash-table :test 'equal)) +(declare-function bbdb-record-get-field "bbdb") +(declare-function bbdb-records "bbdb") +(declare-function bbdb-dwim-mail "bbdb-com") +(declare-function bbdb-search "bbdb-com") + +(defgroup company-bbdb nil + "Completion backend for BBDB." + :group 'company) + +(defcustom company-bbdb-modes '(message-mode) + "Major modes in which `company-bbdb' may complete." + :type '(repeat (symbol :tag "Major mode")) + :package-version '(company . "0.8.8")) + +(defun company-bbdb--candidates (arg) + (cl-mapcan (lambda (record) + (mapcar (lambda (mail) (bbdb-dwim-mail record mail)) + (bbdb-record-get-field record 'mail))) + (eval '(bbdb-search (bbdb-records) arg nil arg)))) ;;;###autoload (defun company-bbdb (command &optional arg &rest ignore) - "A `company-mode' completion back-end for `bbdb'." + "`company-mode' completion backend for BBDB." (interactive (list 'interactive)) - (case command + (cl-case command (interactive (company-begin-backend 'company-bbdb)) - (prefix (and (eq major-mode 'message-mode) + (prefix (and (memq major-mode company-bbdb-modes) (featurep 'bbdb-com) - (looking-back "^\\(To\\|Cc\\|Bcc\\):.*" + (looking-back "^\\(To\\|Cc\\|Bcc\\): *.*?\\([^,; ]*\\)" (line-beginning-position)) - (company-grab-symbol))) - (candidates (mapcan (lambda (record) - (mapcar (lambda (mail) - (let ((full-mail (bbdb-dwim-mail record mail))) - (puthash full-mail record company-bbdb-records) - full-mail)) - (bbdb-record-get-field record 'mail))) - (bbdb-search (bbdb-records) arg nil arg))) - + (match-string-no-properties 2))) + (candidates (company-bbdb--candidates arg)) (sorted t) - (no-cache t) - (t nil))) + (no-cache t))) (provide 'company-bbdb) ;;; company-bbdb.el ends here