unofficial mirror of notmuch@notmuchmail.org
 help / color / mirror / code / Atom feed
* [PATCH] notmuch.el: add functionality to add or remove tags by region.
@ 2010-01-20 20:58 Jesse Rosenthal
  2010-01-21 11:27 ` Jesse Rosenthal
                   ` (2 more replies)
  0 siblings, 3 replies; 32+ messages in thread
From: Jesse Rosenthal @ 2010-01-20 20:58 UTC (permalink / raw)
  To: notmuch; +Cc: jrosenthal


This patch adds `-region' versions of the `notmuch-search-' commands to find properties. It also splits up  `notmuch-add/remove-tags' into both a `-thread' and a `-region' version. (This makes us modify `notmuch-search-archive-thread' to use the `notmuch-search-remove-tag-thread' function, instead of `notmuch-search-remove-tag', for consistency.) The add/remove-tag command called by pressing `+' or `-' will then choose accordingly, based on whether region is active.
---
 notmuch.el |   95 +++++++++++++++++++++++++++++++++++++++++++++++++++++-------
 1 files changed, 84 insertions(+), 11 deletions(-)

diff --git a/notmuch.el b/notmuch.el
index 97914f2..e333f24 100644
--- a/notmuch.el
+++ b/notmuch.el
@@ -1117,18 +1117,41 @@ Complete list of currently available key bindings:
   (set (make-local-variable 'font-lock-defaults)
          '(notmuch-search-font-lock-keywords t)))
 
+(defun notmuch-search-properties-in-region (property beg end)
+  (save-excursion
+    (let ((output nil)
+	  (last-line (line-number-at-pos end)))
+      (goto-char beg)
+      (beginning-of-line)
+      (while (<= (line-number-at-pos) last-line)
+	(setq output (cons (get-text-property (point) property) output))
+	(forward-line 1))
+      output)))
+
 (defun notmuch-search-find-thread-id ()
   "Return the thread for the current thread"
   (get-text-property (point) 'notmuch-search-thread-id))
 
+(defun notmuch-search-find-thread-id-region (beg end)
+  "Return a list of threads for the current region"
+  (notmuch-search-properties-in-region 'notmuch-search-thread-id beg end))
+
 (defun notmuch-search-find-authors ()
   "Return the authors for the current thread"
   (get-text-property (point) 'notmuch-search-authors))
 
+(defun notmuch-search-find-authors-region (beg end)
+  "Return a list of authors for the current region"
+  (notmuch-search-properties-in-region notmuch-search-authors beg end))
+
 (defun notmuch-search-find-subject ()
   "Return the subject for the current thread"
   (get-text-property (point) 'notmuch-search-subject))
 
+(defun notmuch-search-find-subject-region (beg end)
+  "Return a list of authors for the current region"
+  (notmuch-search-properties-in-region notmuch-search-subject beg end))
+
 (defun notmuch-search-show-thread ()
   "Display the currently selected thread."
   (interactive)
@@ -1173,6 +1196,14 @@ and will also appear in a buffer named \"*Notmuch errors*\"."
 	(delete-region beg end)
 	(insert (mapconcat  'identity tags " "))))))
 
+(defun notmuch-search-set-tags-region (tags beg end)
+  (save-excursion
+    (let ((last-line (line-number-at-pos end)))
+      (goto-char beg)
+      (while (<= (line-number-at-pos) last-line)
+	(notmuch-search-set-tags tags)
+	(forward-line)))))
+
 (defun notmuch-search-get-tags ()
   (save-excursion
     (end-of-line)
@@ -1182,32 +1213,74 @@ and will also appear in a buffer named \"*Notmuch errors*\"."
       (let ((end (- (point) 1)))
 	(split-string (buffer-substring beg end))))))
 
+(defun notmuch-search-get-tags-region (beg end)
+  (save-excursion
+    (let ((output nil)
+	  (last-line (line-number-at-pos end)))
+      (goto-char beg)
+      (while (<= (line-number-at-pos) last-line)
+	(setq output (append output (notmuch-search-get-tags)))
+	(forward-line 1))
+      output)))
+
+(defun notmuch-search-add-tag-thread (tag)
+  (notmuch-call-notmuch-process "tag" (concat "+" tag) (notmuch-search-find-thread-id))
+  (notmuch-search-set-tags (delete-dups (sort (cons tag (notmuch-search-get-tags)) 'string<))))
+
+(defun notmuch-search-add-tag-region (tag beg end)
+  (let ((search-id-string (mapconcat 'identity (notmuch-search-find-thread-id-region beg end) " or ")))
+    (notmuch-call-notmuch-process "tag" (concat "+" tag) search-id-string)
+    (notmuch-search-set-tags-region (delete-dups (sort (cons tag (notmuch-search-get-tags-region beg end)) 'string<)) beg end)))
+
+(defun notmuch-search-remove-tag-thread (tag)
+  (notmuch-call-notmuch-process "tag" (concat "-" tag) (notmuch-search-find-thread-id))
+  (notmuch-search-set-tags (delete tag (notmuch-search-get-tags))))
+
+(defun notmuch-search-remove-tag-region (tag beg end)
+  (let ((search-id-string (mapconcat 'identity (notmuch-search-find-thread-id-region beg end) " or ")))
+    (notmuch-call-notmuch-process "tag" (concat "-" tag) search-id-string)
+    (notmuch-search-set-tags-region (delete tag (notmuch-search-get-tags-region beg end)) beg end)))
+
 (defun notmuch-search-add-tag (tag)
-  "Add a tag to the currently selected thread.
+  "Add a tag to the currently selected thread or region.
 
-The tag is added to messages in the currently selected thread
-which match the current search terms."
+The tag is added to messages in the currently selected thread or
+region which match the current search terms."
   (interactive
    (list (notmuch-select-tag-with-completion "Tag to add: ")))
-  (notmuch-call-notmuch-process "tag" (concat "+" tag) (notmuch-search-find-thread-id))
-  (notmuch-search-set-tags (delete-dups (sort (cons tag (notmuch-search-get-tags)) 'string<))))
+  (save-excursion
+    (if (region-active-p)
+	(let* ((beg (region-beginning))
+	       (end (region-end)))
+	  (notmuch-search-add-tag-region tag beg end))
+      (notmuch-search-add-tag-thread tag))))
 
 (defun notmuch-search-remove-tag (tag)
-  "Remove a tag from the currently selected thread.
+  "Remove a tag from the currently selected thread or region.
 
 The tag is removed from messages in the currently selected thread
-which match the current search terms."
+or region which match the current search terms."
   (interactive
-   (list (notmuch-select-tag-with-completion "Tag to remove: " (notmuch-search-find-thread-id))))
-  (notmuch-call-notmuch-process "tag" (concat "-" tag) (notmuch-search-find-thread-id))
-  (notmuch-search-set-tags (delete tag (notmuch-search-get-tags))))
+   (list (notmuch-select-tag-with-completion 
+	  "Tag to remove: "
+	  (if (region-active-p) 
+	      (mapconcat 'identity 
+			 (notmuch-search-find-thread-id-region (region-beginning) (region-end))
+			 " ")
+	    (notmuch-search-find-thread-id)))))
+  (save-excursion
+    (if (region-active-p)
+	(let* ((beg (region-beginning))
+	       (end (region-end)))
+	  (notmuch-search-remove-tag-region tag beg end))
+      (notmuch-search-remove-tag-thread tag))))
 
 (defun notmuch-search-archive-thread ()
   "Archive the currently selected thread (remove its \"inbox\" tag).
 
 This function advances the next thread when finished."
   (interactive)
-  (notmuch-search-remove-tag "inbox")
+  (notmuch-search-remove-tag-thread "inbox")
   (forward-line))
 
 (defun notmuch-search-process-sentinel (proc msg)
-- 
1.6.5.3

^ permalink raw reply related	[flat|nested] 32+ messages in thread

end of thread, other threads:[~2012-01-17  5:03 UTC | newest]

Thread overview: 32+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2010-01-20 20:58 [PATCH] notmuch.el: add functionality to add or remove tags by region Jesse Rosenthal
2010-01-21 11:27 ` Jesse Rosenthal
2010-01-21 15:23 ` Jameson Rollins
2010-01-21 15:35   ` Jesse Rosenthal
2010-01-21 15:56     ` Jameson Rollins
2010-01-21 16:07       ` Jesse Rosenthal
2010-01-21 16:10         ` Jesse Rosenthal
2010-02-17  0:07 ` [PATCH v2] notmuch.el: add functionality in notmuch search mode " Jesse Rosenthal
2010-02-17 12:12   ` [PATCH] notmuch.el: bind 'd' to new function notmuch-search-delete-thread-or-region Sebastian Spaeth
2011-07-15  4:11     ` anarcat
2011-07-19 19:48       ` Matthieu Lemerre
2011-07-16 18:39     ` [PATCH 1/2] add notmuch keybinding 'd' Antoine Beaupré
2012-01-03 14:56       ` David Edmondson
2012-01-03 19:57         ` Jani Nikula
2012-01-03 21:35           ` Jameson Graef Rollins
2012-01-04  8:27             ` Jani Nikula
2012-01-06 20:10           ` Antoine Beaupré
2012-01-06 20:20             ` Jameson Graef Rollins
2012-01-06 20:51             ` David Bremner
2012-01-17  5:02               ` Antoine Beaupré
2012-01-06 21:33             ` Jani Nikula
2012-01-06 21:40             ` Tomi Ollila
2012-01-04  8:52         ` David Edmondson
2012-01-17  5:03           ` Antoine Beaupré
2010-04-07 21:10   ` [PATCH v2] notmuch.el: add functionality in notmuch search mode to add or remove tags by region Carl Worth
2010-04-09 14:11     ` Jesse Rosenthal
2010-04-13 17:55       ` Carl Worth
2010-04-13 18:00         ` Jesse Rosenthal
2010-04-13 18:47         ` [PATCH] Fix bug, and clean up code duplication, in adding or removing tag " Jesse Rosenthal
2010-04-14 17:14           ` Carl Worth
2010-04-14 17:50             ` Jesse Rosenthal
2010-04-14 19:23               ` Mark Anderson

Code repositories for project(s) associated with this public inbox

	https://yhetil.org/notmuch.git/

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).