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)
WHERE HASH *Groups;
WHERE HASH *ReverseAlias;
+#ifdef USE_NOTMUCH
+WHERE HASH *TagTransforms;
+#endif
WHERE LIST *AutoViewList INITVAL(0);
WHERE LIST *AlternativeOrderList INITVAL(0);
#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
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),
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;
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
{
{ "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 },
struct nm_hdrdata {
char *folder;
char *tags;
+ char *tags_transformed;
char *oldpath;
int magic;
};
dprint(2, (debugfile, "nm: freeing header %p\n", data));
FREE(&data->folder);
FREE(&data->tags);
+ FREE(&data->tags_transformed);
FREE(&data->oldpath);
FREE(&data);
}
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;
{
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));
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;
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) {
if (data->tags && tstr && strcmp(data->tags, tstr) == 0) {
FREE(&tstr);
+ FREE(&ttstr);
dprint(2, (debugfile, "nm: tags unchanged\n"));
return 1;
}
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;
}
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);