]> granicus.if.org Git - neomutt/commitdiff
add support for text transforms of tag names
authorEric Davis <edavis@insanum.com>
Sat, 1 Sep 2012 07:31:54 +0000 (09:31 +0200)
committerRichard Russon <rich@flatcap.org>
Mon, 4 Apr 2016 15:30:07 +0000 (16:30 +0100)
tag names visible with '%g' in the index and pager formats

README.notmuch
globals.h
hdrline.c
init.c
init.h
mutt_notmuch.c
mutt_notmuch.h

index ba525ec3df142c61175dbdebd12edbb443b4601a..f2624fca567eec79b7cc4bbeb76c029b2a100757 100644 (file)
@@ -141,6 +141,21 @@ notmuch support for mutt
       the sidebar. It's possible to toggle between virtual and normal folders by
       sidebar-toggle command.
 
+   tag-transforms <tag> <transform> [ ...]
+
+      This command specifies text transforms to be shown instead of the actual
+      tag names with '%g' in the index and pager formats. Note that Unicode
+      symbols can be used for transforms.
+
+      example:
+
+      tag-transforms "inbox"   "i"   \
+                     "unread"  "u"   \
+                     "replied" "↻ "  \
+                     "sent"    "➥ "  \
+                     "todo"    "T"   \
+                     "deleted" "DEL" \
+
    nm_record = <boolean>
 
       Add messages stored to the mutt record (see $record in the mutt docs)
index 0f6ca1eaa614d307915758dad0fb7c94bef7410e..3d1669e58d26f53b66b807aa72338f6a15409da3 100644 (file)
--- a/globals.h
+++ b/globals.h
@@ -161,6 +161,9 @@ WHERE const char *ReleaseDate;
 
 WHERE HASH *Groups;
 WHERE HASH *ReverseAlias;
+#ifdef USE_NOTMUCH
+WHERE HASH *TagTransforms;
+#endif
 
 WHERE LIST *AutoViewList INITVAL(0);
 WHERE LIST *AlternativeOrderList INITVAL(0);
index 50f2966d984c006c3508bd2f6a77b5fc30265081..564e9af48e2a99aedf672935c551dfc84508b6d1 100644 (file)
--- a/hdrline.c
+++ b/hdrline.c
@@ -592,8 +592,8 @@ hdr_format_str (char *dest,
 #ifdef USE_NOTMUCH
     case 'g':
       if (!optional)
-        mutt_format_s (dest, destlen, prefix, nm_header_get_tags(hdr));
-      else if (!nm_header_get_tags(hdr))
+        mutt_format_s (dest, destlen, prefix, nm_header_get_tags_transformed(hdr));
+      else if (!nm_header_get_tags_transformed(hdr))
         optional = 0;
       break;
 #endif
diff --git a/init.c b/init.c
index f2455b3cba1d0b1ac6731aee69c73a670458ddf3..7f3b20b01f039734a000b6311f095163380c7e9a 100644 (file)
--- a/init.c
+++ b/init.c
@@ -3070,7 +3070,10 @@ void mutt_init (int skip_sys_rc, LIST *commands)
 
   Groups = hash_create (1031, 0);
   ReverseAlias = hash_create (1031, 1);
-  
+#ifdef USE_NOTMUCH
+  TagTransforms = hash_create (64, 1);
+#endif
+
   mutt_menu_init ();
 
   snprintf (AttachmentMarker, sizeof (AttachmentMarker),
@@ -3406,6 +3409,39 @@ static int parse_group_context (group_context_t **ctx, BUFFER *buf, BUFFER *s, u
   return -1;
 }
 
+#ifdef USE_NOTMUCH
+int parse_tag_transforms (BUFFER *b, BUFFER *s, unsigned long data, BUFFER *err)
+{
+  char *tmp;
+
+  while (MoreArgs (s))
+  {
+    char *tag, *transform;
+
+    mutt_extract_token (b, s, 0);
+    if (b->data && *b->data)
+      tag = safe_strdup (b->data);
+    else
+      continue;
+
+    mutt_extract_token (b, s, 0);
+    transform = safe_strdup (b->data);
+
+    /* avoid duplicates */
+    tmp = hash_find(TagTransforms, tag);
+    if (tmp) {
+      dprint(3,(debugfile,"tag transform '%s' already registered as '%s'\n", tag, tmp));
+      FREE(&tag);
+      FREE(&transform);
+      continue;
+    }
+
+    hash_insert(TagTransforms, tag, transform, 0);
+  }
+  return 0;
+}
+#endif
+
 static void myvar_set (const char* var, const char* val)
 {
   myvar_t** cur;
diff --git a/init.h b/init.h
index eff76fe981e6f3f4c0ed24dcfdf7c107fedbaecf..4b2293cbf8d9ff679358b251d3403c048f1f3d11 100644 (file)
--- a/init.h
+++ b/init.h
@@ -3916,13 +3916,15 @@ static int parse_unsubscribe (BUFFER *, BUFFER *, unsigned long, BUFFER *);
 static int parse_attachments (BUFFER *, BUFFER *, unsigned long, BUFFER *);
 static int parse_unattachments (BUFFER *, BUFFER *, unsigned long, BUFFER *);
 
-
 static int parse_alternates (BUFFER *, BUFFER *, unsigned long, BUFFER *);
 static int parse_unalternates (BUFFER *, BUFFER *, unsigned long, BUFFER *);
 
 /* Parse -group arguments */
 static int parse_group_context (group_context_t **ctx, BUFFER *buf, BUFFER *s, unsigned long data, BUFFER *err);
 
+#ifdef USE_NOTMUCH
+static int parse_tag_transforms (BUFFER *, BUFFER *, unsigned long, BUFFER *);
+#endif
 
 struct command_t
 {
@@ -3965,6 +3967,7 @@ const struct command_t Commands[] = {
   { "unmailboxes",     mutt_parse_mailboxes,   M_UNMAILBOXES },
 #ifdef USE_NOTMUCH
   { "virtual-mailboxes",mutt_parse_virtual_mailboxes, 0 },
+  { "tag-transforms",parse_tag_transforms, 0 },
 #endif
   { "mailto_allow",    parse_list,             UL &MailtoAllow },
   { "unmailto_allow",  parse_unlist,           UL &MailtoAllow },
index 2c3e72bcc37b7063fa4741c469dd01d9dc067832..916777a4cea6b702f30fdba34d32e26e9077da5a 100644 (file)
@@ -66,6 +66,7 @@ struct uri_tag {
 struct nm_hdrdata {
        char *folder;
        char *tags;
+       char *tags_transformed;
        char *oldpath;
        int magic;
 };
@@ -176,6 +177,7 @@ static void free_hdrdata(struct nm_hdrdata *data)
        dprint(2, (debugfile, "nm: freeing header %p\n", data));
        FREE(&data->folder);
        FREE(&data->tags);
+       FREE(&data->tags_transformed);
        FREE(&data->oldpath);
        FREE(&data);
 }
@@ -271,6 +273,11 @@ char *nm_header_get_tags(HEADER *h)
        return h && h->data ? ((struct nm_hdrdata *) h->data)->tags : NULL;
 }
 
+char *nm_header_get_tags_transformed(HEADER *h)
+{
+       return h && h->data ? ((struct nm_hdrdata *) h->data)->tags_transformed : NULL;
+}
+
 int nm_header_get_magic(HEADER *h)
 {
        return h && h->data ? ((struct nm_hdrdata *) h->data)->magic : 0;
@@ -545,8 +552,8 @@ static int update_header_tags(HEADER *h, notmuch_message_t *msg)
 {
        struct nm_hdrdata *data = h->data;
        notmuch_tags_t *tags;
-       char *tstr = NULL, *p;
-       size_t sz = 0;
+       char *tstr = NULL, *ttstr = NULL, *p;
+       size_t sz = 0, tsz = 0;
 
        dprint(2, (debugfile, "nm: tags update requested (%s)\n", h->env->message_id));
 
@@ -556,6 +563,8 @@ static int update_header_tags(HEADER *h, notmuch_message_t *msg)
 
                const char *t = notmuch_tags_get(tags);
                size_t xsz = t ? strlen(t) : 0;
+               const char *tt = NULL;
+               size_t txsz = 0;
 
                if (!xsz)
                        continue;
@@ -572,6 +581,26 @@ static int update_header_tags(HEADER *h, notmuch_message_t *msg)
                                continue;
                }
 
+               tt = hash_find(TagTransforms, t);
+
+               if (tt) {
+                       txsz = strlen(tt);
+               } else {
+                       tt = t;
+                       txsz = xsz;
+               }
+
+               /* expand the transformed tag string */
+               safe_realloc(&ttstr, tsz + (tsz ? 1 : 0) + txsz + 1);
+               p = ttstr + tsz;
+               if (tsz) {
+                   *p++ = ' ';
+                   tsz++;
+               }
+               memcpy(p, tt, txsz + 1);
+               tsz += txsz;
+
+               /* expand the un-transformed tag string */
                safe_realloc(&tstr, sz + (sz ? 1 : 0) + xsz + 1);
                p = tstr + sz;
                if (sz) {
@@ -584,6 +613,7 @@ static int update_header_tags(HEADER *h, notmuch_message_t *msg)
 
        if (data->tags && tstr && strcmp(data->tags, tstr) == 0) {
                FREE(&tstr);
+               FREE(&ttstr);
                dprint(2, (debugfile, "nm: tags unchanged\n"));
                return 1;
        }
@@ -591,6 +621,8 @@ static int update_header_tags(HEADER *h, notmuch_message_t *msg)
        FREE(&data->tags);
        data->tags = tstr;
        dprint(2, (debugfile, "nm: new tags: '%s'\n", tstr));
+       data->tags_transformed = ttstr;
+       dprint(2, (debugfile, "nm: new tag transforms: '%s'\n", ttstr));
        return 0;
 }
 
index 7ea77f3941531389f8b02b5dd46ddafe2fea4c72..33ba69630358ad75f2fa7958eb588d8a768c60f7 100644 (file)
@@ -11,6 +11,7 @@ char *nm_header_get_folder(HEADER *h);
 int nm_header_get_magic(HEADER *h);
 char *nm_header_get_fullpath(HEADER *h, char *buf, size_t bufsz);
 char *nm_header_get_tags(HEADER *h);
+char *nm_header_get_tags_transformed(HEADER *h);
 int nm_update_filename(CONTEXT *ctx, const char *o, const char *n, HEADER *h);
 char *nm_uri_from_query(CONTEXT *ctx, char *buf, size_t bufsz);
 int nm_modify_message_tags(CONTEXT *ctx, HEADER *hdr, char *tags);