[PATCH 2/5] emacs: allow the tag caller to specify possible completions.

Subject: [PATCH 2/5] emacs: allow the tag caller to specify possible completions.

Date: Fri, 30 Nov 2012 08:21:28 +0000

To: notmuch@notmuchmail.org

Cc:

From: Mark Walters


From: markwalters1009 <markwalters1009@gmail.com>

Previously notmuch tag would always query the database for possible
tag completions (allowing all tags for + but only tags present in the
messages being tagged for -). This allows the caller so specify these
completion lists.
---
 emacs/notmuch-tag.el |   30 +++++++++++++++++++++++-------
 1 files changed, 23 insertions(+), 7 deletions(-)

diff --git a/emacs/notmuch-tag.el b/emacs/notmuch-tag.el
index 1f3d8cf..c8508d1 100644
--- a/emacs/notmuch-tag.el
+++ b/emacs/notmuch-tag.el
@@ -68,13 +68,18 @@ the messages that were tagged"
   (let ((tag-list (notmuch-tag-completions search-terms)))
     (completing-read prompt tag-list nil nil nil 'notmuch-select-tag-history)))
 
-(defun notmuch-read-tag-changes (&optional initial-input search-terms)
+(defun notmuch-read-tag-changes (&optional initial-input
+					   search-terms
+					   negative-completions
+					   positive-completions)
   (let* ((all-tag-list (notmuch-tag-completions))
-	 (add-tag-list (mapcar (apply-partially 'concat "+") all-tag-list))
+	 (add-tag-list (mapcar (apply-partially 'concat "+")
+			       (or positive-completions all-tag-list)))
 	 (remove-tag-list (mapcar (apply-partially 'concat "-")
-				  (if search-terms
-				      (notmuch-tag-completions search-terms)
-				    all-tag-list)))
+				  (or negative-completions
+				      (if search-terms
+					  (notmuch-tag-completions search-terms)
+					all-tag-list))))
 	 (tag-list (append add-tag-list remove-tag-list))
 	 (crm-separator " ")
 	 ;; By default, space is bound to "complete word" function.
@@ -108,7 +113,7 @@ from TAGS if present."
 	   (error "Changed tag must be of the form `+this_tag' or `-that_tag'")))))
     (sort result-tags 'string<)))
 
-(defun notmuch-tag (query &optional tag-changes)
+(defun notmuch-tag (query &optional tag-changes negative-completions positive-completions)
   "Add/remove tags in TAG-CHANGES to messages matching QUERY.
 
 QUERY should be a string containing the search-terms.
@@ -119,6 +124,14 @@ interpreted as a single tag change.  If TAG-CHANGES is the string
 \"-\" or \"+\", or null, then the user is prompted to enter the
 tag changes.
 
+NEGATIVE-COMPLETIONS and POSITIVE-COMPLETIONS should be lists of
+tags that should be used for tab-completion for
+removal (i.e. after a \"-\") and addition (i.e. after a
+\"+\") repectively. If either of these is nil the possible
+completions will be read from the notmuch database. This does not
+stop the removal or addition of a tag; it just changes which tags
+can be tag-completed.
+
 Note: Other code should always use this function alter tags of
 messages instead of running (notmuch-call-notmuch-process \"tag\" ..)
 directly, so that hooks specified in notmuch-before-tag-hook and
@@ -126,7 +139,10 @@ notmuch-after-tag-hook will be run."
   ;; Perform some validation
   (if (string-or-null-p tag-changes)
       (if (or (string= tag-changes "-") (string= tag-changes "+") (null tag-changes))
-	  (setq tag-changes (notmuch-read-tag-changes tag-changes query))
+	  (setq tag-changes (notmuch-read-tag-changes tag-changes
+						      query
+						      negative-completions
+						      positive-completions))
 	(setq tag-changes (list tag-changes))))
   (mapc (lambda (tag-change)
 	  (unless (string-match-p "^[-+]\\S-+$" tag-change)
-- 
1.7.9.1


Thread: