From mboxrd@z Thu Jan 1 00:00:00 1970 From: John Kitchin Subject: Re: org-contacts email completion by tags Date: Fri, 06 Jun 2014 21:39:35 -0400 Message-ID: <8761kd7b1k.fsf@andrew.cmu.edu> References: <87oay8ez6c.fsf@tanger.home> <87bnu7fucv.fsf@tanger.home> Mime-Version: 1.0 Content-Type: text/plain Return-path: Received: from eggs.gnu.org ([2001:4830:134:3::10]:36574) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Wt5bY-0006Fs-1j for emacs-orgmode@gnu.org; Fri, 06 Jun 2014 21:39:37 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1Wt5bP-0000Uy-5J for emacs-orgmode@gnu.org; Fri, 06 Jun 2014 21:39:31 -0400 Received: from mail-qa0-x22f.google.com ([2607:f8b0:400d:c00::22f]:35674) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Wt5bO-0000Ud-VY for emacs-orgmode@gnu.org; Fri, 06 Jun 2014 21:39:23 -0400 Received: by mail-qa0-f47.google.com with SMTP id s7so5072599qap.6 for ; Fri, 06 Jun 2014 18:39:22 -0700 (PDT) In-Reply-To: (John Kitchin's message of "Thu, 5 Jun 2014 12:54:19 -0400") List-Id: "General discussions about Org-mode." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: emacs-orgmode-bounces+geo-emacs-orgmode=m.gmane.org@gnu.org Sender: emacs-orgmode-bounces+geo-emacs-orgmode=m.gmane.org@gnu.org To: Daimrod Cc: "emacs-orgmode@gnu.org" Here is what I finally ended up with to allow completion with tag expressions. I did not figure out how to avoid overwriting an org-contacts function. I thought I could find the right hooks to use, but I could not figure it out. It is only a one line modification to the org-contacts function. This works for tag expressions, but I have not gotten it to work with properties. (defun org-contacts-complete-tags (start end tag-expression) "insert emails from org-contacts that match the tags expression. For example: group-phd will match entries tagged with group but not with phd." (let* ((completion-ignore-case org-contacts-completion-ignore-case) (group-completion-p t)) (let ((result (mapconcat 'identity (loop for contact in (org-contacts-db) for contact-name = (car contact) for email = (org-contacts-strip-link (car (org-contacts-split-property (or (cdr (assoc-string org-contacts-email-property (caddr contact))) "")))) for tags = (cdr (assoc "TAGS" (nth 2 contact))) for tags-list = (if tags (split-string (substring (cdr (assoc "TAGS" (nth 2 contact))) 1 -1) ":") '()) if (let ((todo-only nil)) (eval (cdr (org-make-tags-matcher tag-expression)))) collect (org-contacts-format-email contact-name email)) ","))) (when (not (string= "" result)) ;; return (start end function) (lexical-let* ((to-return result)) (list start end (lambda (string pred &optional to-ignore) to-return))))))) this is the function I overwrote in my init files: (defun org-contacts-message-complete-function (&optional start) "Function used in `completion-at-point-functions' in `message-mode'." ;; Avoid to complete in `post-command-hook'. (when completion-in-region-mode (remove-hook 'post-command-hook #'completion-in-region--postch)) (let ((mail-abbrev-mode-regexp "^\\(Resent-To\\|To\\|B?Cc\\|Reply-To\\|From\\|Mail-Followup-To\\|Mail-Copies-To\\|Disposition-Notification-To\\|Return-Receipt-To\\):")) (when (mail-abbrev-in-expansion-header-p) (lexical-let* ((end (point)) (start (or start (save-excursion (re-search-backward "\\(\\`\\|[\n:,]\\)[ \t]*") (goto-char (match-end 0)) (point)))) (string (buffer-substring start end))) (or ;; I added the next line (org-contacts-complete-tags start end string) (org-contacts-complete-group start end string) (org-contacts-complete-name start end string)))))) -- ----------------------------------- John Kitchin Professor Doherty Hall A207F Department of Chemical Engineering Carnegie Mellon University Pittsburgh, PA 15213 412-268-7803 http://kitchingroup.cheme.cmu.edu