Re: [O] org-contacts email completion by tags
Daimrod daim...@gmail.com writes: Thanks, but I'm refactoring org-contacts a bit, and I think I have found a slightly better way to do that, but in the meantime you can use the aforementioned hook for your function. It turns out that my idea was wrong, so I have used a version very similar to yours. The function is triggered by the prefix '#' (customizable) and can be used to match tags and properties. e.g. the following expression: #work-phdBIRTHDAY will look for contacts with the tag 'work' but not the tag 'phd' and for which there is a BIRTHDAY properties. Best, -- Daimrod/Greg
Re: [O] org-contacts email completion by tags
John Kitchin jkitc...@andrew.cmu.edu writes: Hi, First, sorry for the late reply. 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. I've added a new hook `org-contacts-complete-functions' that you can use to plug your 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))) Thanks, but I'm refactoring org-contacts a bit, and I think I have found a slightly better way to do that, but in the meantime you can use the aforementioned hook for your function. Best, -- Daimrod/Greg
Re: [O] org-contacts email completion by tags
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
Re: [O] org-contacts email completion by tags
On Thu, Jun 5, 2014 at 7:50 AM, Daimrod daim...@gmail.com wrote: org-contacts-complete-group Here is a better function I think. It uses the builtin org-contacts database: (defun insert-emails-from-tags (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. (interactive sTags: ) (insert (mapconcat 'identity (loop for contact in (org-contacts-filter) 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)) ,))) John --- John Kitchin Associate Professor Doherty Hall A207F Department of Chemical Engineering Carnegie Mellon University Pittsburgh, PA 15213 412-268-7803 http://kitchingroup.cheme.cmu.edu
[O] org-contacts email completion by tags
Hi all, I have setup org-contacts and completion of emails in message mode. I have some contacts that are tagged :group: and some tagged :group:ms: If I put +group in the email To field, it completes to all of the entries (awesome!) But +group-ms does not work. Is that a bug, or a known limit of org-contacts? That search works fine with C-c am. Thanks, John --- John Kitchin Associate Professor Doherty Hall A207F Department of Chemical Engineering Carnegie Mellon University Pittsburgh, PA 15213 412-268-7803 http://kitchingroup.cheme.cmu.edu