From 2f48b75840f16197e585be6f4821cfc6fd86bf0d Mon Sep 17 00:00:00 2001 From: Austin Clements Date: Wed, 23 Oct 2013 15:50:53 +2000 Subject: [PATCH] [PATCH 4/8] emacs: Use interactive specifications for tag changes in search --- f3/d889eee690a354a82e3ed8baa5e9db32433065 | 201 ++++++++++++++++++++++ 1 file changed, 201 insertions(+) create mode 100644 f3/d889eee690a354a82e3ed8baa5e9db32433065 diff --git a/f3/d889eee690a354a82e3ed8baa5e9db32433065 b/f3/d889eee690a354a82e3ed8baa5e9db32433065 new file mode 100644 index 000000000..268b13c58 --- /dev/null +++ b/f3/d889eee690a354a82e3ed8baa5e9db32433065 @@ -0,0 +1,201 @@ +Return-Path: +X-Original-To: notmuch@notmuchmail.org +Delivered-To: notmuch@notmuchmail.org +Received: from localhost (localhost [127.0.0.1]) + by olra.theworths.org (Postfix) with ESMTP id 5C177431FD7 + for ; Tue, 22 Oct 2013 12:51:48 -0700 (PDT) +X-Virus-Scanned: Debian amavisd-new at olra.theworths.org +X-Spam-Flag: NO +X-Spam-Score: -0.7 +X-Spam-Level: +X-Spam-Status: No, score=-0.7 tagged_above=-999 required=5 + tests=[RCVD_IN_DNSWL_LOW=-0.7] autolearn=disabled +Received: from olra.theworths.org ([127.0.0.1]) + by localhost (olra.theworths.org [127.0.0.1]) (amavisd-new, port 10024) + with ESMTP id CAZ2u8zGdxJ3 for ; + Tue, 22 Oct 2013 12:51:42 -0700 (PDT) +Received: from dmz-mailsec-scanner-6.mit.edu (dmz-mailsec-scanner-6.mit.edu + [18.7.68.35]) + by olra.theworths.org (Postfix) with ESMTP id 5D110429E32 + for ; Tue, 22 Oct 2013 12:51:17 -0700 (PDT) +X-AuditID: 12074423-b7fc98e0000009a2-56-5266d7339018 +Received: from mailhub-auth-3.mit.edu ( [18.9.21.43]) + by dmz-mailsec-scanner-6.mit.edu (Symantec Messaging Gateway) with SMTP + id 28.6A.02466.337D6625; Tue, 22 Oct 2013 15:51:15 -0400 (EDT) +Received: from outgoing.mit.edu (outgoing-auth-1.mit.edu [18.9.28.11]) + by mailhub-auth-3.mit.edu (8.13.8/8.9.2) with ESMTP id r9MJp39r030254; + Tue, 22 Oct 2013 15:51:04 -0400 +Received: from drake.dyndns.org (31-33-57.wireless.csail.mit.edu + [128.31.33.57]) (authenticated bits=0) + (User authenticated as amdragon@ATHENA.MIT.EDU) + by outgoing.mit.edu (8.13.8/8.12.4) with ESMTP id r9MJp17R005196 + (version=TLSv1/SSLv3 cipher=AES256-SHA bits=256 verify=NOT); + Tue, 22 Oct 2013 15:51:03 -0400 +Received: from amthrax by drake.dyndns.org with local (Exim 4.77) + (envelope-from ) + id 1VYhym-0006yk-PV; Tue, 22 Oct 2013 15:51:00 -0400 +From: Austin Clements +To: notmuch@notmuchmail.org +Subject: [PATCH 4/8] emacs: Use interactive specifications for tag changes in + search +Date: Tue, 22 Oct 2013 15:50:53 -0400 +Message-Id: <1382471457-26056-5-git-send-email-amdragon@mit.edu> +X-Mailer: git-send-email 1.8.4.rc3 +In-Reply-To: <1382471457-26056-1-git-send-email-amdragon@mit.edu> +References: <1382471457-26056-1-git-send-email-amdragon@mit.edu> +X-Brightmail-Tracker: + H4sIAAAAAAAAA+NgFtrEIsWRmVeSWpSXmKPExsUixCmqrWt8PS3IYMdeHovrN2cyOzB6PFt1 + izmAMYrLJiU1J7MstUjfLoEr48TsP0wFr7UqFi9qY2tgvKvcxcjJISFgIrHu6k4WCFtM4sK9 + 9WxdjFwcQgL7GCX2b1vABOFsZJSYefY+K4RzjEniYs9/dghnLqPEyu9vmED62QQ0JLbtX84I + YosISEvsvDsbqIODg1lATeJPlwpIWFggROJ0wyQ2EJtFQFWi+eJCZhCbV8BBorfvPBvEGUoS + C09tYwWxOQUcJabv+8cGMkYIqObUHY4JjPwLGBlWMcqm5Fbp5iZm5hSnJusWJyfm5aUW6Zrp + 5WaW6KWmlG5iBAUNu4vyDsY/B5UOMQpwMCrx8D5oSQsSYk0sK67MPcQoycGkJMobcRUoxJeU + n1KZkVicEV9UmpNafIhRgoNZSYS32Rcox5uSWFmVWpQPk5LmYFES573FYR8kJJCeWJKanZpa + kFoEk5Xh4FCS4BW6BtQoWJSanlqRlplTgpBm4uAEGc4DNPwYyGLe4oLE3OLMdIj8KUZFKXFe + YZBmAZBERmkeXC8sql8xigO9IszLCVLFA0wIcN2vgAYzAQ2esgRscEkiQkoKGN36UvHzpvCw + a5e6OMbp9UhWLnoStD+rlCVQSMdy/dPgyTZZIRbS6zb43j68vNgz0ObO6p1xC87xc0o6FTLu + atdxZO7mqDng+pJdjf/ArgTbuCjmXwqZge0Kzh/sN733W7G02vyEseTbqZptfAU6RXWqrXl6 + 2z/k5kzYpetxT+1UsdIegx9KLMUZiYZazEXFiQDnOcw0xQIAAA== +X-BeenThere: notmuch@notmuchmail.org +X-Mailman-Version: 2.1.13 +Precedence: list +List-Id: "Use and development of the notmuch mail system." + +List-Unsubscribe: , + +List-Archive: +List-Post: +List-Help: +List-Subscribe: , + +X-List-Received-Date: Tue, 22 Oct 2013 19:51:48 -0000 + +This is similar to the previous commit, but applies to search. + +Search is somewhat more complicated because its tagging operations can +also apply to a region. Hence, this lifts interactive prompting into +a helper function. This also takes advantage of the new ability to +provide a prompt to distinguish tagging a single thread from tagging a +region of threads. +--- + emacs/notmuch.el | 70 +++++++++++++++++++++++++++++++++++--------------------- + 1 file changed, 44 insertions(+), 26 deletions(-) + +diff --git a/emacs/notmuch.el b/emacs/notmuch.el +index e0511c8..5492e1b 100644 +--- a/emacs/notmuch.el ++++ b/emacs/notmuch.el +@@ -560,43 +560,59 @@ will be signaled." + (setq output (append output (notmuch-search-get-tags pos))))) + output)) + +-(defun notmuch-search-tag-region (beg end &optional tag-changes) +- "Change tags for threads in the given region." ++(defun notmuch-search-interactive-region () ++ "Return the bounds of the current interactive region. ++ ++This returns (BEG END), where BEG and END are the bounds of the ++region if the region is active, or both `point' otherwise." ++ (if (region-active-p) ++ (list (region-beginning) (region-end)) ++ (list (point) (point)))) ++ ++(defun notmuch-search-interactive-tag-changes (&optional initial-input) ++ "Prompt for tag changes for the current thread or region. ++ ++Returns (TAG-CHANGES REGION-BEGIN REGION-END)." ++ (let* ((region (notmuch-search-interactive-region)) ++ (beg (first region)) (end (second region)) ++ (prompt (if (= beg end) "Tag thread" "Tag region"))) ++ (cons (notmuch-read-tag-changes ++ (notmuch-search-get-tags-region beg end) prompt initial-input) ++ region))) ++ ++(defun notmuch-search-tag (tag-changes &optional beg end) ++ "Change tags for the currently selected thread or region. ++ ++See `notmuch-tag' for information on the format of TAG-CHANGES. ++If BEG or END are nil, applies to the thread at point." ++ (interactive (notmuch-search-interactive-tag-changes)) ++ (unless (and beg end) (setq beg (point) end (point))) + (let ((search-string (notmuch-search-find-thread-id-region-search beg end))) +- (setq tag-changes (notmuch-tag search-string tag-changes)) ++ (notmuch-tag search-string tag-changes) + (notmuch-search-foreach-result beg end + (lambda (pos) + (notmuch-search-set-tags + (notmuch-update-tags (notmuch-search-get-tags pos) tag-changes) + pos))))) + +-(defun notmuch-search-tag (&optional tag-changes) +- "Change tags for the currently selected thread or region. +- +-See `notmuch-tag' for information on the format of TAG-CHANGES." +- (interactive) +- (let* ((beg (if (region-active-p) (region-beginning) (point))) +- (end (if (region-active-p) (region-end) (point)))) +- (notmuch-search-tag-region beg end tag-changes))) +- +-(defun notmuch-search-add-tag () +- "Change tags for the current thread (defaulting to add). ++(defun notmuch-search-add-tag (tag-changes &optional beg end) ++ "Change tags for the current thread or region (defaulting to add). + + Same as `notmuch-search-tag' but sets initial input to '+'." +- (interactive) +- (notmuch-search-tag "+")) ++ (interactive (notmuch-search-interactive-tag-changes "+")) ++ (notmuch-search-tag tag-changes beg end)) + +-(defun notmuch-search-remove-tag () +- "Change tags for the current thread (defaulting to remove). ++(defun notmuch-search-remove-tag (tag-changes &optional beg end) ++ "Change tags for the current thread or region (defaulting to remove). + + Same as `notmuch-search-tag' but sets initial input to '-'." +- (interactive) +- (notmuch-search-tag "-")) ++ (interactive (notmuch-search-interactive-tag-changes "-")) ++ (notmuch-search-tag tag-changes beg end)) + + (put 'notmuch-search-archive-thread 'notmuch-prefix-doc + "Un-archive the currently selected thread.") +-(defun notmuch-search-archive-thread (&optional unarchive) +- "Archive the currently selected thread. ++(defun notmuch-search-archive-thread (&optional unarchive beg end) ++ "Archive the currently selected thread or region. + + Archive each message in the currently selected thread by applying + the tag changes in `notmuch-archive-tags' to each (remove the +@@ -605,10 +621,10 @@ messages will be \"unarchived\" (i.e. the tag changes in + `notmuch-archive-tags' will be reversed). + + This function advances the next thread when finished." +- (interactive "P") ++ (interactive (cons current-prefix-arg (notmuch-search-interactive-region))) + (when notmuch-archive-tags + (notmuch-search-tag +- (notmuch-tag-change-list notmuch-archive-tags unarchive))) ++ (notmuch-tag-change-list notmuch-archive-tags unarchive) beg end)) + (notmuch-search-next-thread)) + + (defun notmuch-search-update-result (result &optional pos) +@@ -832,11 +848,13 @@ non-authors is found, assume that all of the authors match." + (notmuch-sexp-parse-partial-list 'notmuch-search-show-result + results-buf))))) + +-(defun notmuch-search-tag-all (&optional tag-changes) ++(defun notmuch-search-tag-all (tag-changes) + "Add/remove tags from all messages in current search buffer. + + See `notmuch-tag' for information on the format of TAG-CHANGES." +- (interactive) ++ (interactive ++ (list (notmuch-read-tag-changes ++ (notmuch-search-get-tags-region (point-min) (point-max)) "Tag all"))) + (notmuch-tag notmuch-search-query-string tag-changes)) + + (defun notmuch-search-buffer-title (query) +-- +1.8.4.rc3 + -- 2.26.2