From 629173528a5331596121f7e9b84cdb4cd7d53342 Mon Sep 17 00:00:00 2001 From: Austin Clements Date: Wed, 23 Oct 2013 20:21:57 +2000 Subject: [PATCH] [PATCH v2 4/8] emacs: Use interactive specifications for tag changes in search --- 7d/e9861fbf72345729f7df5533080eb836596a36 | 205 ++++++++++++++++++++++ 1 file changed, 205 insertions(+) create mode 100644 7d/e9861fbf72345729f7df5533080eb836596a36 diff --git a/7d/e9861fbf72345729f7df5533080eb836596a36 b/7d/e9861fbf72345729f7df5533080eb836596a36 new file mode 100644 index 000000000..86aea153c --- /dev/null +++ b/7d/e9861fbf72345729f7df5533080eb836596a36 @@ -0,0 +1,205 @@ +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 389A8429E35 + for ; Tue, 22 Oct 2013 17:22:15 -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 ErUFsnXHfZwJ for ; + Tue, 22 Oct 2013 17:22:07 -0700 (PDT) +Received: from dmz-mailsec-scanner-4.mit.edu (dmz-mailsec-scanner-4.mit.edu + [18.9.25.15]) + by olra.theworths.org (Postfix) with ESMTP id 25E79431FBC + for ; Tue, 22 Oct 2013 17:22:07 -0700 (PDT) +X-AuditID: 1209190f-b7fa08e0000009c6-a5-526716ae4fce +Received: from mailhub-auth-3.mit.edu ( [18.9.21.43]) + by dmz-mailsec-scanner-4.mit.edu (Symantec Messaging Gateway) with SMTP + id CC.A6.02502.EA617625; Tue, 22 Oct 2013 20:22:06 -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 r9N0M5AH027448; + Tue, 22 Oct 2013 20:22:05 -0400 +Received: from drake.dyndns.org + (216-15-114-40.c3-0.arl-ubr1.sbo-arl.ma.cable.rcn.com + [216.15.114.40]) (authenticated bits=0) + (User authenticated as amdragon@ATHENA.MIT.EDU) + by outgoing.mit.edu (8.13.8/8.12.4) with ESMTP id r9N0M3t2005843 + (version=TLSv1/SSLv3 cipher=AES256-SHA bits=256 verify=NOT); + Tue, 22 Oct 2013 20:22:04 -0400 +Received: from amthrax by drake.dyndns.org with local (Exim 4.77) + (envelope-from ) + id 1VYmD5-0008KK-PF; Tue, 22 Oct 2013 20:22:03 -0400 +From: Austin Clements +To: notmuch@notmuchmail.org +Subject: [PATCH v2 4/8] emacs: Use interactive specifications for tag changes + in search +Date: Tue, 22 Oct 2013 20:21:57 -0400 +Message-Id: <1382487721-31776-5-git-send-email-amdragon@mit.edu> +X-Mailer: git-send-email 1.8.4.rc3 +In-Reply-To: <1382487721-31776-1-git-send-email-amdragon@mit.edu> +References: <1382487721-31776-1-git-send-email-amdragon@mit.edu> +X-Brightmail-Tracker: + H4sIAAAAAAAAA+NgFtrDIsWRmVeSWpSXmKPExsUixCmqrbtOLD3IYOk+dYvVc3ksrt+cyezA + 5LFz1l12j2erbjEHMEVx2aSk5mSWpRbp2yVwZVxe3sVa0KhTcbnlGFMD4w2VLkZODgkBE4mu + 1Y8ZIWwxiQv31rN1MXJxCAnsY5SYMmcxlLORUeLgldUsEM4dJomfRx5AZeYySvxeupwNpJ9N + QENi2/7lYLNEBKQldt6dzQpiMws4SnzevwisRlggXKJjWhdYDYuAqsTkv3uBajg4eAUcJGb+ + M4E4Q0li4altYK2cQK1vdnwAaxUCKpmy8wzLBEb+BYwMqxhlU3KrdHMTM3OKU5N1i5MT8/JS + i3RN9HIzS/RSU0o3MYIDSZJ/B+O3g0qHGAU4GJV4eB+0pAUJsSaWFVfmHmKU5GBSEuVV508P + EuJLyk+pzEgszogvKs1JLT7EKMHBrCTC2+wLVM6bklhZlVqUD5OS5mBREue9yWEfJCSQnliS + mp2aWpBaBJOV4eBQkuBlAkaMkGBRanpqRVpmTglCmomDE2Q4D9BwZZAa3uKCxNzizHSI/ClG + RSlx3jOiQAkBkERGaR5cLyzSXzGKA70izPsMpIoHmCTgul8BDWYCGjxlCcjVxSWJCCmpBsa8 + CPb3D3Ker3YKXbUgTv8gx4dX08P7zfIE3J8UhTy2tZ4gzsu3cUbJ/bo/NvpLgvw3SzFffTxF + cmnkSu4D73f/nxwxe3Jn/tf9ku5MXH3PuI67LJ1kbzVxykPT518m27E5T2mskPFjO6DOcL36 + iejOz/w1bNW710SaTK/z27WE75/F9E8RS/qVWIozEg21mIuKEwFU8m84zwIAAA== +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: Wed, 23 Oct 2013 00:22:15 -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 | 73 ++++++++++++++++++++++++++++++++++++-------------------- + 1 file changed, 47 insertions(+), 26 deletions(-) + +diff --git a/emacs/notmuch.el b/emacs/notmuch.el +index e0511c8..53e9826 100644 +--- a/emacs/notmuch.el ++++ b/emacs/notmuch.el +@@ -560,43 +560,62 @@ 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. ++When called interactively, this uses the region if the region is ++active. When called directly, BEG and END provide the region. ++If these are nil or not provided, this 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 +624,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 +851,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