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

Re: wish: file/directory funtions for maildir etc (was: Re: New IMAP function: rename-mailbox)



On Fri, 25 Feb 2005, TAKAHASHI Tamotsu wrote:
> On Tue, 22 Feb 2005, Tamotsu Takahashi wrote:
> > On Tue, Feb 22, 2005 at 12:52:38PM +0100, Gregor Zattler wrote:
> > > me too.  Deleting, moving, copying, renaming, linking of mailboxes
> > > would be very useful.  
> > > 
> > > Dito a funktion which simply shows the file name of a message
> > > (like <display-name>) and the possibility to (hard) link a
> > > message to another maildir.
> > 
> > A feature which allows a user to type '!mv %s anotherfile'
> > (on a message [in index] or a mailbox [in browser]) would be
> > useful;
> > 
> > delete a maildir: !rm -fr %s
> > safely delete?:   !ls %s/cur/* %s/new/* || rm -r %s
> > move a maildir:   !mv %s another
> > link a message:   !ln %s `dirname %s`/../anotherdir/cur/
> > 
> > But this will introduce incompatibility if implemented.
> > (i.e. '%%s' for literal '%s')
> 
> I tried to make a patch, but failed to complete it.
> The attached patch works only for a single object
> (a message in index, a file/directory in browser).
> If someone implements a support for tagged object,
> it will be a very useful feature.

Done.

-- 
tamo
Index: OPS
===================================================================
RCS file: /home/roessler/cvs/mutt/OPS,v
retrieving revision 3.6
diff -u -r3.6 OPS
--- OPS 17 Feb 2005 03:33:00 -0000      3.6
+++ OPS 27 Feb 2005 02:27:56 -0000
@@ -133,6 +133,7 @@
 OP_PAGER_HIDE_QUOTED "toggle display of quoted text"
 OP_PAGER_SKIP_QUOTED "skip beyond quoted text"
 OP_PAGER_TOP "jump to the top of the message"
+OP_PASS_TO_COMMAND "pass filename to a shell command"
 OP_PIPE "pipe message/attachment to a shell command"
 OP_PREV_ENTRY "move to the previous entry"
 OP_PREV_LINE "scroll up one line"
Index: browser.c
===================================================================
RCS file: /home/roessler/cvs/mutt/browser.c,v
retrieving revision 3.14
diff -u -r3.14 browser.c
--- browser.c   17 Feb 2005 03:33:00 -0000      3.14
+++ browser.c   27 Feb 2005 02:27:56 -0000
@@ -829,6 +829,57 @@
        mutt_menuDestroy (&menu);
        goto bail;
 
+      case OP_PASS_TO_COMMAND:
+       if (state.entrylen)
+       {
+         char full[_POSIX_PATH_MAX];
+         char tfiles[LONG_STRING];
+
+         full[0] = 0;
+         tfiles[0] = 0;
+
+         if (menu->tagprefix)
+         {
+           if (menu->tagged)
+           {
+             short i, split = 0;
+             char *pos = tfiles;
+             for (i = 0; i < state.entrylen; i++)
+             {
+               struct folder_file ff = state.entry[i];
+               if (ff.tagged)
+               {
+                 size_t len = sizeof (tfiles) - (pos - tfiles);
+                 if (buffy)
+                   safe_strcat (full, sizeof (full), ff.name);
+                 else
+                   mutt_concat_path (full, LastDir, ff.name, sizeof (full));
+                 mutt_expand_path (full, sizeof (full));
+                 if (split)
+                   pos = safe_strcat (pos, len--, " ");
+                 pos = safe_strcat (pos, len, full);
+                 split = -1;
+               }
+             }
+           }
+           else
+             mutt_error _("No tagged messages.");
+         }
+         else
+         {
+           if (buffy)
+             safe_strcat (full, sizeof (full), 
state.entry[menu->current].name);
+           else
+             mutt_concat_path (full, LastDir, state.entry[menu->current].name, 
sizeof (full));
+           mutt_expand_path (full, sizeof (full));
+           safe_strcat (tfiles, sizeof (tfiles), full);
+         }
+
+         mutt_pass_to_command (tfiles);
+         MAYBE_REDRAW (menu->redraw);
+       }
+       break;
+
       case OP_BROWSER_TELL:
         if(state.entrylen)
          mutt_message("%s", state.entry[menu->current].name);
Index: commands.c
===================================================================
RCS file: /home/roessler/cvs/mutt/commands.c,v
retrieving revision 3.30
diff -u -r3.30 commands.c
--- commands.c  12 Feb 2005 19:19:24 -0000      3.30
+++ commands.c  27 Feb 2005 02:27:57 -0000
@@ -988,4 +988,49 @@
   return rv;
 }
 
+void mutt_pass_to_command (const char *path)
+{
+  char command[HUGE_STRING];
+  char format[LONG_STRING];
+  char files[LONG_STRING];
+
+  format[0] = 0;
+  if (mutt_get_field (_("Pass to command: "), format, sizeof (format), M_CMD)
+      != 0 || !format[0])
+    return;
+  mutt_expand_path (format, sizeof (format));
+
+  files[0] = 0;
+  if (path)
+    safe_strcat (files, sizeof (files), path);
+  else
+  {
+    /* handle tagged _messages_, because browser always gives path */
+    char *pos = files;
+    short i, split = 0;
+    for (i = 0; i < Context->vcount; i++)
+    {
+      HEADER *hdr = Context->hdrs[Context->v2r[i]];
+      if (hdr->tagged)
+      {
+       char full[_POSIX_PATH_MAX];
+       size_t len = sizeof (files) - (pos - files);
+       mutt_concat_path (full, NONULL (Context->path), hdr->path, sizeof 
(full));
+       mutt_expand_path (full, sizeof (full));
+       if (split)
+         pos = safe_strcat (pos, len--, " ");
+       pos = safe_strcat (pos, len, full);
+       split = -1;
+      }
+    }
+  }
+
+  mutt_expand_fmt (command, sizeof (command), format, files);
+
+  CLEARLINE (LINES-1);
+  mutt_endwin (NULL);
+  fflush (stdout);
+  if (mutt_system (command) != 0 || option (OPTWAITKEY))
+    mutt_any_key_to_continue (NULL);
+}
 
Index: curs_main.c
===================================================================
RCS file: /home/roessler/cvs/mutt/curs_main.c,v
retrieving revision 3.20
diff -u -r3.20 curs_main.c
--- curs_main.c 12 Feb 2005 19:19:24 -0000      3.20
+++ curs_main.c 27 Feb 2005 02:27:57 -0000
@@ -1903,6 +1903,22 @@
        }
         break;
       
+      case OP_PASS_TO_COMMAND:
+
+       CHECK_MSGCOUNT;
+       CHECK_VISIBLE;
+       if (tag)
+         mutt_pass_to_command (NULL);
+       else
+        {
+         char path[_POSIX_PATH_MAX];
+         mutt_concat_path (path, NONULL (Context->path), CURHDR->path, sizeof 
(path));
+         mutt_expand_path (path, sizeof (path));
+         mutt_pass_to_command (path);
+       }
+       MAYBE_REDRAW (menu->redraw);
+       break;
+
       case OP_PIPE:
 
        CHECK_MSGCOUNT;
Index: functions.h
===================================================================
RCS file: /home/roessler/cvs/mutt/functions.h,v
retrieving revision 3.9
diff -u -r3.9 functions.h
--- functions.h 17 Feb 2005 03:33:00 -0000      3.9
+++ functions.h 27 Feb 2005 02:27:57 -0000
@@ -131,6 +131,7 @@
   { "buffy-list",              OP_BUFFY_LIST,                  "." },
   { "sync-mailbox",            OP_MAIN_SYNC_FOLDER,            "$" },
   { "display-address",         OP_DISPLAY_ADDRESS,             "@" },
+  { "pass-to-command",         OP_PASS_TO_COMMAND,             NULL },
   { "pipe-message",            OP_PIPE,                        "|" },
   { "next-new",                        OP_MAIN_NEXT_NEW,               NULL },
   { "next-new-then-unread",    OP_MAIN_NEXT_NEW_THEN_UNREAD,   "\t" },
@@ -347,6 +348,7 @@
   { "toggle-mailboxes", OP_TOGGLE_MAILBOXES,   "\t" },
   { "view-file",       OP_BROWSER_VIEW_FILE,   " " },
   { "buffy-list",      OP_BUFFY_LIST,          "." },
+  { "pass-to-command", OP_PASS_TO_COMMAND,     NULL },
 #ifdef USE_IMAP
   { "create-mailbox",   OP_CREATE_MAILBOX,      "C" },
   { "delete-mailbox",   OP_DELETE_MAILBOX,      "d" },
Index: protos.h
===================================================================
RCS file: /home/roessler/cvs/mutt/protos.h,v
retrieving revision 3.25
diff -u -r3.25 protos.h
--- protos.h    1 Feb 2005 03:36:39 -0000       3.25
+++ protos.h    27 Feb 2005 02:27:58 -0000
@@ -222,6 +222,7 @@
 void mutt_unprepare_envelope (ENVELOPE *);
 void mutt_pretty_mailbox (char *);
 void mutt_pretty_size (char *, size_t, long);
+void mutt_pass_to_command (const char *);
 void mutt_pipe_message (HEADER *);
 void mutt_print_message (HEADER *);
 void mutt_print_patchlist (void);