]> granicus.if.org Git - neomutt/commitdiff
notmuch: Allow <modify-labels> to toggle labels
authorBryan Bennett <bbenne10@gmail.com>
Tue, 24 Jan 2017 15:49:14 +0000 (10:49 -0500)
committerRichard Russon <rich@flatcap.org>
Tue, 24 Jan 2017 17:25:02 +0000 (17:25 +0000)
<modify-labels> can, now:
    tag     add a tag
    +tag    add a tag
    -tag    remove a tag
    !tag    toggle a tag

Closes #326
Closes #328

README.notmuch
doc/manual.xml.head
mutt_notmuch.c

index 471d22adf542a69a099d6c1d23937ac051658aae..663428d4ccc7a328c7e2a8ba6bb7976293f2feac 100644 (file)
@@ -97,7 +97,7 @@ notmuch support for mutt
       - note: TAB completion of 'tag:' names is available
 
    modify-labels:
-      - add or remove notmuch tags; [+]<tag> to add, -<tag> to remove
+      - add, remove, or toggle notmuch tags; [+]<tag> to add, -<tag> to remove, !<tag> to toggle
       - default key: `
       - note: TAB completion of tag names is available
       - example: "+AAA +BBB -CCC"
index 70f85f2119c3f3e8f11748cde41f6f9ec7551e65..c959b11ad381edbdb2cabe728d343a5d26dd7b3e 100644 (file)
@@ -12644,6 +12644,9 @@ bind index,pager + entire-thread
 <emphasis role="comment"># modify (notmuch) tags</emphasis>
 bind index,pager \` modify-labels
 
+<emphasis role="comment"># modify (notmuch) tag non-interactively.</emphasis>
+bind index,pager tt "&lt;modify-labels&gt;!todo\n" "Toggle the 'todo' tag"
+
 <emphasis role="comment"># generate virtual folder from query</emphasis>
 bind index,pager \eX vfolder-from-query
 
index 7646a25f21e9eca1234452852697000784bac6e2..e66d380ea62e0c83540db8492f9b9616c1831889 100644 (file)
@@ -1321,6 +1321,23 @@ static notmuch_message_t *get_nm_message(notmuch_database_t *db, HEADER *hdr)
   return msg;
 }
 
+static bool nm_message_has_tag(notmuch_message_t *msg, char *tag)
+{
+  const char *possible_match_tag;
+  notmuch_tags_t *tags;
+
+  for (tags = notmuch_message_get_tags(msg); notmuch_tags_valid(tags);
+       notmuch_tags_move_to_next(tags))
+  {
+    possible_match_tag = notmuch_tags_get(tags);
+    if (mutt_strncmp(possible_match_tag, tag, mutt_strlen(tag)) == 0)
+    {
+      return true;
+    }
+  }
+  return false;
+}
+
 static int update_tags(notmuch_message_t *msg, const char *tags)
 {
   char *tag = NULL, *end = NULL, *p;
@@ -1353,6 +1370,18 @@ static int update_tags(notmuch_message_t *msg, const char *tags)
       dprint(1, (debugfile, "nm: remove tag: '%s'\n", tag + 1));
       notmuch_message_remove_tag(msg, tag + 1);
     }
+    else if (*tag == '!')
+    {
+      dprint(1, (debugfile, "nm: toggle tag: '%s'\n", tag + 1));
+      if (nm_message_has_tag (msg, tag + 1))
+      {
+        notmuch_message_remove_tag (msg, tag + 1);
+      }
+      else
+      {
+        notmuch_message_add_tag (msg, tag + 1);
+      }
+    }
     else
     {
       dprint(1, (debugfile, "nm: add tag: '%s'\n", (*tag == '+') ? tag + 1 : tag));