From: Eric Davis Date: Sat, 1 Sep 2012 07:31:54 +0000 (+0200) Subject: add support for text transforms of tag names X-Git-Tag: neomutt-20160404~13^2~33 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=0285eabc43f1e1b919aed98bfbfdf0325ff843c5;p=neomutt add support for text transforms of tag names tag names visible with '%g' in the index and pager formats --- diff --git a/README.notmuch b/README.notmuch index ba525ec3d..f2624fca5 100644 --- a/README.notmuch +++ b/README.notmuch @@ -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 [ ...] + + 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 = Add messages stored to the mutt record (see $record in the mutt docs) diff --git a/globals.h b/globals.h index 0f6ca1eaa..3d1669e58 100644 --- 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); diff --git a/hdrline.c b/hdrline.c index 50f2966d9..564e9af48 100644 --- 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 f2455b3cb..7f3b20b01 100644 --- 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 eff76fe98..4b2293cbf 100644 --- 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 }, diff --git a/mutt_notmuch.c b/mutt_notmuch.c index 2c3e72bcc..916777a4c 100644 --- a/mutt_notmuch.c +++ b/mutt_notmuch.c @@ -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; } diff --git a/mutt_notmuch.h b/mutt_notmuch.h index 7ea77f394..33ba69630 100644 --- a/mutt_notmuch.h +++ b/mutt_notmuch.h @@ -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);