OP_MAIN_CHANGE_VFOLDER "open a different virtual folder"
OP_MAIN_VFOLDER_FROM_QUERY "generate virtual folder from query"
+OP_MAIN_WINDOWED_VFOLDER_FROM_QUERY "generate virtual folder from query and time window"
+OP_MAIN_WINDOWED_VFOLDER_FORWARD "shifts virtual folder time window forwards"
+OP_MAIN_WINDOWED_VFOLDER_BACKWARD "shifts virtual folder time window backwards"
OP_MAIN_MODIFY_LABELS "modify (notmuch) tags"
OP_MAIN_MODIFY_LABELS_THEN_HIDE "modify labels and then hide message"
OP_MAIN_ENTIRE_THREAD "read entire thread of the current message"
main_change_folder(menu, op, buf, sizeof (buf), &oldcount, &index_hint, 0);
break;
+ case OP_MAIN_WINDOWED_VFOLDER_FROM_QUERY:
+ dprint(2, (debugfile, "OP_MAIN_WINDOWED_VFOLDER_FROM_QUERY\n"));
+ if (NotmuchQueryWindowDuration < 0)
+ {
+ mutt_message (_("Windowed queries disabled."));
+ break;
+ }
+ if (!nm_query_window_check_timebase(NotmuchQueryWindowTimebase))
+ {
+ mutt_message (_("Invalid nm_query_window_timebase value (valid values are: hour, day, week, month or year)."));
+ break;
+ }
+ buf[0] = '\0';
+ if ((mutt_get_field ("Query: ", buf, sizeof (buf), MUTT_NM_QUERY) != 0) || !buf[0])
+ {
+ mutt_message (_("No query, aborting."));
+ break;
+ }
+ nm_setup_windowed_query(buf, sizeof (buf));
+ nm_query_window_reset();
+ if (!nm_uri_from_windowed_query(Context, buf, sizeof(buf), NotmuchQueryWindowTimebase, NotmuchQueryWindowDuration))
+ mutt_message (_("Failed to create query, aborting."));
+ else
+ {
+ dprint(2, (debugfile, "nm: windowed query (%s)\n", buf));
+ main_change_folder(menu, op, buf, sizeof (buf), &oldcount, &index_hint, 0);
+ }
+ break;
+
+ case OP_MAIN_WINDOWED_VFOLDER_BACKWARD:
+ dprint(2, (debugfile, "OP_MAIN_WINDOWED_VFOLDER_BACKWARD\n"));
+ if (NotmuchQueryWindowDuration < 0)
+ {
+ mutt_message (_("Windowed queries disabled."));
+ break;
+ }
+ if (!nm_query_window_check_timebase(NotmuchQueryWindowTimebase))
+ {
+ mutt_message (_("Invalid nm_query_window_timebase value (valid values are: hour, day, week, month or year)."));
+ break;
+ }
+ buf[0] = '\0';
+ nm_query_window_backward();
+ if (!nm_uri_from_windowed_query(Context, buf, sizeof(buf), NotmuchQueryWindowTimebase, NotmuchQueryWindowDuration))
+ mutt_message (_("Failed to create query, aborting."));
+ else
+ {
+ dprint(2, (debugfile, "nm: - windowed query (%s)\n", buf));
+ main_change_folder(menu, op, buf, sizeof (buf), &oldcount, &index_hint, 0);
+ }
+ break;
+
+ case OP_MAIN_WINDOWED_VFOLDER_FORWARD:
+ dprint(2, (debugfile, "OP_MAIN_WINDOWED_VFOLDER_FORWARD\n"));
+ if (NotmuchQueryWindowDuration < 0)
+ {
+ mutt_message (_("Windowed queries disabled."));
+ break;
+ }
+ if (!nm_query_window_check_timebase(NotmuchQueryWindowTimebase))
+ {
+ mutt_message (_("Invalid nm_query_window_timebase value (valid values are: hour, day, week, month or year)."));
+ break;
+ }
+ buf[0] = '\0';
+ nm_query_window_forward();
+ if (!nm_uri_from_windowed_query(Context, buf, sizeof(buf), NotmuchQueryWindowTimebase, NotmuchQueryWindowDuration))
+ mutt_message (_("Failed to create query, aborting."));
+ else
+ {
+ dprint(2, (debugfile, "nm: + windowed query (%s)\n", buf));
+ main_change_folder(menu, op, buf, sizeof (buf), &oldcount, &index_hint, 0);
+ }
+ break;
+
case OP_MAIN_CHANGE_VFOLDER:
#endif
<entry><literal><vfolder-from-query></literal></entry>
<entry>generate virtual folder from query</entry>
</row>
+ <row>
+ <entry>index,pager</entry>
+ <entry><literal><windowed-vfolder-from-query></literal></entry>
+ <entry>generate virtual folder from query with window applied</entry>
+ </row>
+ <row>
+ <entry>index,pager</entry>
+ <entry><literal><windowed-vfolder-forward></literal></entry>
+ <entry>generate virtual folder by moving the query's time window forward</entry>
+ </row>
+ <row>
+ <entry>index,pager</entry>
+ <entry><literal><windowed-vfolder-backward></literal></entry>
+ <entry>generate virtual folder by moving the query's time window backward</entry>
+ </row>
</tbody>
</tgroup>
</table>
# as a spoolfile.</emphasis>
set virtual_spoolfile = no
+<emphasis role="comment"># setup time window preferences
+# first setup the duration, and then the time unit of that duration</emphasis>
+set nm_query_window_duration=2
+set nm_query_window_timebase="week" # or "hour", "day", "week", "month", "year"
+
<emphasis role="comment"># --------------------------------------------------------------------------
# FUNCTIONS - shown with an example mapping
# --------------------------------------------------------------------------
<emphasis role="comment"># generate virtual folder from query</emphasis>
bind index,pager \eX vfolder-from-query
+<emphasis role="comment"># generate virtual folder from query with time window</emphasis>
+bind index,pager \\ windowed-vfolder-from-query
+bind index,pager < windowed-vfolder-backward
+bind index,pager > windowed-vfolder-forward
+
<emphasis role="comment"># modify labels and then hide message
# bind index,pager ??? modify-labels-then-hide
<listitem><para>Vladimir Marek <email>Vladimir.Marek@oracle.com</email></para></listitem>
<listitem><para>Víctor Manuel Jáquez Leal <email>vjaquez@igalia.com</email></para></listitem>
<listitem><para>Richard Russon <email>rich@flatcap.org</email></para></listitem>
+ <listitem><para>Bernard 'Guyzmo' Pratz <email>guyzmo+github+pub@m0g.net</email></para></listitem>
</itemizedlist>
</sect2>
</sect1>
# as a spoolfile.
set virtual_spoolfile = no
+# set the time base to apply to the time window
+# valid values are: "hour", "day", "week", "month", "year"
+set nm_query_window_timebase="week"
+
+# how large shall the window be? Any positive integer value is fine, in the
+# unit of the previously defined timebase. If 0 is set, the feature is disabled.
+set nm_query_window_duration=2
+
# --------------------------------------------------------------------------
# FUNCTIONS - shown with an example mapping
# --------------------------------------------------------------------------
# generate virtual folder from query
bind index,pager \eX vfolder-from-query
+# generate a virtual folder with a time window
+bind index \\ windowed-vfolder-from-query
+
+# move the time window forward
+bind index > windowed-vfolder-forward
+
+# move the time window backward
+bind index < windowed-vfolder-backward
+
# modify labels and then hide message
# bind index,pager ??? modify-labels-then-hide
syntax keyword muttrcVarNum contained skipwhite nm_db_limit nextgroup=muttrcSetNumAssignment,muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr
syntax keyword muttrcVarNum contained skipwhite nm_open_timeout nextgroup=muttrcSetNumAssignment,muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr
+syntax keyword muttrcVarNum contained skipwhite nm_query_window_duration nextgroup=muttrcSetNumAssignment,muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr
+syntax keyword muttrcVarNum contained skipwhite nm_query_window_timebase nextgroup=muttrcSetNumAssignment,muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr
+
syntax keyword muttrcVarStr contained skipwhite nm_default_uri nextgroup=muttrcVarEqualsIdxFmt
syntax keyword muttrcVarStr contained skipwhite nm_exclude_tags nextgroup=muttrcVarEqualsIdxFmt
syntax keyword muttrcVarStr contained skipwhite nm_hidden_tags nextgroup=muttrcVarEqualsIdxFmt
syntax match muttrcFunction contained "\<modify-labels\>"
syntax match muttrcFunction contained "\<sidebar-toggle-virtual\>"
syntax match muttrcFunction contained "\<vfolder-from-query\>"
+syntax match muttrcFunction contained "\<windowed-vfolder-from-query\>"
+syntax match muttrcFunction contained "\<windowed-vfolder-forward\>"
+syntax match muttrcFunction contained "\<windowed-vfolder-backward\>"
#ifdef USE_NOTMUCH
{ "change-vfolder", OP_MAIN_CHANGE_VFOLDER, NULL },
{ "vfolder-from-query", OP_MAIN_VFOLDER_FROM_QUERY, NULL },
+ { "windowed-vfolder-from-query", OP_MAIN_WINDOWED_VFOLDER_FROM_QUERY, NULL },
+ { "windowed-vfolder-backward", OP_MAIN_WINDOWED_VFOLDER_BACKWARD, NULL },
+ { "windowed-vfolder-forward", OP_MAIN_WINDOWED_VFOLDER_FORWARD, NULL },
{ "modify-labels", OP_MAIN_MODIFY_LABELS, NULL },
{ "modify-labels-then-hide", OP_MAIN_MODIFY_LABELS_THEN_HIDE, NULL },
{ "entire-thread", OP_MAIN_ENTIRE_THREAD, NULL },
WHERE int NotmuchDBLimit;
WHERE char *NotmuchQueryType;
WHERE char *NotmuchRecordTags;
+WHERE int NotmuchQueryWindowDuration;
+WHERE char *NotmuchQueryWindowTimebase;
+WHERE int NotmuchQueryWindowCurrentPosition;
+WHERE char *NotmuchQueryWindowCurrentSearch;
#endif
** .pp
** This variable specifies the default tags applied to messages stored to the mutt record.
*/
+ { "nm_query_window_duration", DT_NUM, R_NONE, UL &NotmuchQueryWindowDuration, 2 },
+ /*
+ ** .pp
+ ** This variable sets the time base of a windowed notmuch query.
+ ** Accepted values are 'minute', 'hour', 'day', 'week', 'month', 'year'
+ */
+ { "nm_query_window_timebase", DT_STR, R_NONE, UL &NotmuchQueryWindowTimebase, UL "week" },
+ /*
+ ** .pp
+ ** This variable sets the time duration of a windowed notmuch query.
+ ** Accepted values all non negative integers. A value of 0 disables the feature.
+ */
+ { "nm_query_window_current_search", DT_STR, R_NONE, UL &NotmuchQueryWindowCurrentSearch, UL "" },
+ /*
+ ** .pp
+ ** This variable sets the time duration of a windowed notmuch query.
+ ** Accepted values all non negative integers. A value of 0 disables the feature.
+ */
+ { "nm_query_window_current_position", DT_NUM, R_NONE, UL &NotmuchQueryWindowCurrentPosition, 0 },
+ /*
+ ** .pp
+ ** This variable contains the currently setup notmuch search for window based vfolder.
+ */
#endif
{ "pager", DT_PATH, R_NONE, UL &Pager, UL "builtin" },
/*
return buf;
}
+void nm_setup_windowed_query(char *buf, size_t bufsz)
+{
+ dprint(2, (debugfile, "nm_setup_windowed_query (%s)\n", buf));
+ mutt_str_replace(&NotmuchQueryWindowCurrentSearch, buf);
+}
+
+int nm_query_window_check_timebase(char *timebase)
+{
+ if ((strcmp(timebase, "hour") == 0) ||
+ (strcmp(timebase, "day") == 0) ||
+ (strcmp(timebase, "week") == 0) ||
+ (strcmp(timebase, "month") == 0) ||
+ (strcmp(timebase, "year") == 0))
+ return true;
+ return false;
+}
+
+char *nm_uri_from_windowed_query(CONTEXT *ctx, char *buf, size_t bufsz, char *timebase, int duration)
+{
+ dprint(2, (debugfile, "nm_uri_from_windowed_query (%s, %s, %d)\n", buf, timebase, duration));
+
+ int beg = duration * (NotmuchQueryWindowCurrentPosition + 1);
+ int end = duration * NotmuchQueryWindowCurrentPosition;
+
+ if (NotmuchQueryWindowCurrentSearch == NULL)
+ {
+ nm_query_window_reset();
+ return NULL;
+ }
+
+ if (end == 0)
+ snprintf(buf, bufsz, "date:%d%s..now and %s", beg, timebase, NotmuchQueryWindowCurrentSearch);
+ else
+ snprintf(buf, bufsz, "date:%d%s..%d%s and %s", beg, timebase, end, timebase, NotmuchQueryWindowCurrentSearch);
+
+ return nm_uri_from_query(ctx, buf, bufsz);
+}
+
+void nm_query_window_reset()
+{
+ dprint(2, (debugfile, "nm_query_window_reset ()\n"));
+ NotmuchQueryWindowCurrentPosition = 0;
+}
+
+void nm_query_window_backward()
+{
+ NotmuchQueryWindowCurrentPosition += 1;
+ dprint(2, (debugfile, "nm_query_window_backward (%d)\n", NotmuchQueryWindowCurrentPosition));
+}
+
+void nm_query_window_forward()
+{
+ if (NotmuchQueryWindowCurrentPosition != 0)
+ NotmuchQueryWindowCurrentPosition -= 1;
+
+ dprint(2, (debugfile, "nm_query_window_forward (%d)\n", NotmuchQueryWindowCurrentPosition));
+}
+
/*
* returns message from notmuch database
*/
char *nm_uri_from_query(CONTEXT *ctx, char *buf, size_t bufsz);
int nm_modify_message_tags(CONTEXT *ctx, HEADER *hdr, char *tags);
+void nm_setup_windowed_query(char *buf, size_t bufsz);
+char *nm_uri_from_windowed_query(CONTEXT *ctx, char *buf, size_t bufsz, char *timebase, int duration);
+void nm_query_window_reset();
+void nm_query_window_backward();
+void nm_query_window_forward();
+int nm_query_window_check_timebase(char *timebase);
+
void nm_longrun_init(CONTEXT *cxt, int writable);
void nm_longrun_done(CONTEXT *cxt);