<<< Date Index >>>     <<< Thread Index >>>

How about "next-new in any folder" functionality?



Hi,

Before I started using mutt, I was using pine and I liked the way I
could just go to the first new message by pressing TAB, no matter what
folder the message was in.

I was wondering if there is any interest in getting this feature into
mutt. 

To try it out, I created an initial version of a patch (attached), but
this is mostly to show the kinds of changes to be made and to try it out
and see how it works. It adds a boolean option "next_new_all_folders"
that changes the behaviour of next-new to allow you to jump to the next 
new message even if it is in another folder.

There are currently still a few things wrong with the patch:
- it doesn't have the right name
- it doesn't update PATCHES
- it does not properly indent the big switch in curs_main.c (this is
  intentional to keep the patch small and easy to read for now)
- it does not work properly in empty folders
- I haven't tested it with previous-new and *-new-then-unread

If this sounds like a useful feature, I'll clean up the patch, fix the
problems and submit it properly.

Regards,
Maurice.

P.S: Would you accept cosmetic patches to replace tabs with spaces? 
     Tabs and spaces are now used inconsistently.

-- 
Maurice van der Pot

Gentoo Linux Developer   griffon26@xxxxxxxxxx     http://www.gentoo.org
Creator of BiteMe!       griffon26@xxxxxxxxxxxx   http://www.kfk4ever.com

Index: OPS
===================================================================
RCS file: /cvsroots/mutt/OPS,v
retrieving revision 3.7
diff -u -B -r3.7 OPS
--- OPS 24 Jul 2005 16:51:38 -0000      3.7
+++ OPS 28 Jun 2006 18:23:39 -0000
@@ -108,6 +108,7 @@
 OP_MAIN_LIMIT "show only messages matching a pattern"
 OP_MAIN_LINK_THREADS "link tagged message to the current one"
 OP_MAIN_NEXT_NEW "jump to the next new message"
+OP_MAIN_NEXT_NEW_FOLDER "jump to the next new message even if it is in another 
folder"
 OP_MAIN_NEXT_NEW_THEN_UNREAD "jump to the next new or unread message"
 OP_MAIN_NEXT_SUBTHREAD "jump to the next subthread"
 OP_MAIN_NEXT_THREAD "jump to the next thread"
Index: curs_main.c
===================================================================
RCS file: /cvsroots/mutt/curs_main.c,v
retrieving revision 3.38
diff -u -B -r3.38 curs_main.c
--- curs_main.c 8 Jun 2006 11:56:05 -0000       3.38
+++ curs_main.c 28 Jun 2006 18:23:40 -0000
@@ -422,6 +422,7 @@
 {
   char buf[LONG_STRING], helpstr[SHORT_STRING];
   int op = OP_NULL;
+  int new_op = OP_NULL;
   int done = 0;                /* controls when to exit the "event" loop */
   int i = 0, j;
   int tag = 0;                 /* has the tag-prefix command been pressed? */
@@ -608,17 +609,17 @@
       }
 #endif
 
-      op = km_dokey (MENU_MAIN);
+      new_op = km_dokey (MENU_MAIN);
 
       dprint(4, (debugfile, "mutt_index_menu[%d]: Got op %d\n", __LINE__, op));
 
-      if (op == -1)
+      if (new_op == -1)
        continue; /* either user abort or timeout */
       
       mutt_curs_set (1);
       
       /* special handling for the tag-prefix function */
-      if (op == OP_TAG_PREFIX)
+      if (new_op == OP_TAG_PREFIX)
       {
        if (!Context)
        {
@@ -638,7 +639,7 @@
        clrtoeol ();
 
        /* get the real command */
-       if ((op = km_dokey (MENU_MAIN)) == OP_TAG_PREFIX)
+       if ((new_op = km_dokey (MENU_MAIN)) == OP_TAG_PREFIX)
        {
          /* abort tag sequence */
          CLEARLINE (LINES-1);
@@ -648,7 +649,7 @@
       else if (option (OPTAUTOTAG) && Context && Context->tagged)
        tag = 1;
 
-      if (op == OP_TAG_PREFIX_COND)
+      if (new_op == OP_TAG_PREFIX_COND)
       {
        if (!Context)
        {
@@ -674,7 +675,7 @@
        clrtoeol ();
 
        /* get the real command */
-       if ((op = km_dokey (MENU_MAIN)) == OP_TAG_PREFIX)
+       if ((new_op = km_dokey (MENU_MAIN)) == OP_TAG_PREFIX)
        {
          /* abort tag sequence */
          CLEARLINE (LINES-1);
@@ -694,6 +695,10 @@
       mutt_curs_set (1);       /* fallback from the pager */
     }
 
+    do
+    {
+      op = new_op;
+      new_op = OP_NULL;
     switch (op)
     {
 
@@ -1051,6 +1056,7 @@
          menu->redraw = REDRAW_FULL;
        break;
 
+      case OP_MAIN_NEXT_NEW_FOLDER:
       case OP_MAIN_CHANGE_FOLDER:
       
        if (attach_msg)
@@ -1068,6 +1074,16 @@
        buf[0] = '\0';
        mutt_buffy (buf, sizeof (buf));
 
+          if (op == OP_MAIN_NEXT_NEW_FOLDER)
+          {
+            if (!buf[0])
+            {
+              mutt_error _("No new messages");
+              break;
+            }
+          }
+          else
+          {
        if (mutt_enter_fname (cp, buf, sizeof (buf), &menu->redraw, 1) == -1)
         {
           if (menu->menu == MENU_PAGER)
@@ -1083,6 +1099,7 @@
          CLEARLINE (LINES-1);
          break;
        }
+       }
 
        mutt_expand_path (buf, sizeof (buf));
        if (mx_get_magic (buf) <= 0)
@@ -1480,10 +1497,18 @@
 
        if (menu->current == -1)
        {
+            if (option (OPTNEXTNEWALLFOLDERS))
+            {
+              menu->current = menu->oldcurrent;
+              new_op = OP_MAIN_NEXT_NEW_FOLDER;
+            }
+            else
+            {
          menu->current = menu->oldcurrent;
          mutt_error ("%s%s.", (op == OP_MAIN_NEXT_NEW || op == 
OP_MAIN_PREV_NEW) ? _("No new messages") : _("No unread messages"),
                      Context->pattern ? _(" in this limited view") : "");
        }
+          }
        else if (menu->menu == MENU_PAGER)
        {
          op = OP_DISPLAY_MESSAGE;
@@ -2183,6 +2208,7 @@
        if (menu->menu == MENU_MAIN)
          km_error_key (MENU_MAIN);
     }
+    } while(new_op != OP_NULL);
 
     if (menu->menu == MENU_PAGER)
     {
Index: init.h
===================================================================
RCS file: /cvsroots/mutt/init.h,v
retrieving revision 3.99
diff -u -B -r3.99 init.h
--- init.h      19 May 2006 18:17:38 -0000      3.99
+++ init.h      28 Jun 2006 18:23:43 -0000
@@ -1297,6 +1297,12 @@
   ** This variable, when set, makes the thread tree narrower, allowing
   ** deeper threads to fit on the screen.
   */
+  { "next_new_all_folders", DT_BOOL, R_NONE, OPTNEXTNEWALLFOLDERS, 0 },
+  /*
+  ** .pp
+  ** When set, next-new will go to the next new message even if it is in
+  ** another folder.
+  */
 #ifdef USE_SOCKET
   { "net_inc", DT_NUM,  R_NONE, UL &NetInc, 10 },
   /*
Index: mutt.h
===================================================================
RCS file: /cvsroots/mutt/mutt.h,v
retrieving revision 3.65
diff -u -B -r3.65 mutt.h
--- mutt.h      28 Apr 2006 19:52:45 -0000      3.65
+++ mutt.h      28 Jun 2006 18:23:43 -0000
@@ -399,6 +399,7 @@
   OPTMHPURGE,
   OPTMIMEFORWDECODE,
   OPTNARROWTREE,
+  OPTNEXTNEWALLFOLDERS,
   OPTPAGERSTOP,
   OPTPIPEDECODE,
   OPTPIPESPLIT,

Attachment: pgptjLxUoHzSu.pgp
Description: PGP signature