On Wed, May 22, 2013 at 07:42:42AM +0000, Mark Lumsden wrote:
> To make the shell-command-on-region and this command behave
> like that requires another diff.
> 
> mark
I'm fine with this diff going in first and polishing it intree, it works fine
for commands with > 1 line of output.
 
> On Wed, May 22, 2013 at 09:32:45AM +0200, Jasper Lievisse Adriaanse wrote:
> > On Tue, May 21, 2013 at 07:54:31PM +0000, Mark Lumsden wrote:
> > > This diff modifies the shell-command-on-region function and gives us
> > > shell-command. It makes getting output from other commands into mg
> > > really easy. Comments/oks?
> > > 
> > > -lum
> > 
> > It seems Emacs doesn't split the window if the output from the command is 
> > only
> > a single line (like 'date'), which is behaviour I quite like if you want to
> > check something small.
> > 
> > > Index: def.h
> > > ===================================================================
> > > RCS file: /cvs/src/usr.bin/mg/def.h,v
> > > retrieving revision 1.135
> > > diff -u -p -r1.135 def.h
> > > --- def.h 25 Mar 2013 11:41:44 -0000      1.135
> > > +++ def.h 21 May 2013 19:46:38 -0000
> > > @@ -592,6 +592,7 @@ int            region_get_data(struct region *, c
> > >  void              region_put_data(const char *, int);
> > >  int               markbuffer(int, int);
> > >  int               piperegion(int, int);
> > > +int               shellcommand(int, int);
> > >  int               pipeio(const char * const, char * const[], char * 
> > > const, int,
> > >                struct buffer *);
> > >  
> > > Index: funmap.c
> > > ===================================================================
> > > RCS file: /cvs/src/usr.bin/mg/funmap.c,v
> > > retrieving revision 1.45
> > > diff -u -p -r1.45 funmap.c
> > > --- funmap.c      27 Dec 2012 18:51:52 -0000      1.45
> > > +++ funmap.c      21 May 2013 19:46:38 -0000
> > > @@ -179,6 +179,7 @@ static struct funmap functnames[] = {
> > >   {setfillcol, "set-fill-column",},
> > >   {setmark, "set-mark-command",},
> > >   {setprefix, "set-prefix-string",},
> > > + {shellcommand, "shell-command",},
> > >   {piperegion, "shell-command-on-region",},
> > >   {shrinkwind, "shrink-window",},
> > >  #ifdef NOTAB
> > > Index: keymap.c
> > > ===================================================================
> > > RCS file: /cvs/src/usr.bin/mg/keymap.c,v
> > > retrieving revision 1.50
> > > diff -u -p -r1.50 keymap.c
> > > --- keymap.c      7 Jun 2012 15:15:04 -0000       1.50
> > > +++ keymap.c      21 May 2013 19:46:38 -0000
> > > @@ -217,8 +217,9 @@ static PF metacV[] = {
> > >   pagenext                /* ^V */
> > >  };
> > >  
> > > -static PF metasp[] = {
> > > - justone                 /* space */
> > > +static PF metaspex[] = {
> > > + justone,                /* space */
> > > + shellcommand            /* ! */
> > >  };
> > >  
> > >  static PF metapct[] = {
> > > @@ -317,7 +318,7 @@ struct KEYMAPE (8 + IMAPEXT) metamap = {
> > >                   CCHR('V'), CCHR('V'), metacV, NULL
> > >           },
> > >           {
> > > -                 ' ', ' ', metasp, NULL
> > > +                 ' ', '!', metaspex, NULL
> > >           },
> > >           {
> > >                   '%', '%', metapct, NULL
> > > Index: mg.1
> > > ===================================================================
> > > RCS file: /cvs/src/usr.bin/mg/mg.1,v
> > > retrieving revision 1.75
> > > diff -u -p -r1.75 mg.1
> > > --- mg.1  28 Dec 2012 16:12:50 -0000      1.75
> > > +++ mg.1  21 May 2013 19:46:38 -0000
> > > @@ -268,6 +268,8 @@ suspend-emacs
> > >  scroll-other-window
> > >  .It M-SPC
> > >  just-one-space
> > > +.It M-!
> > > +shell-command
> > >  .It M-.
> > >  find-tag
> > >  .It M-*
> > > @@ -835,6 +837,8 @@ Used by auto-fill-mode.
> > >  Sets the mark in the current window to the current dot location.
> > >  .It set-prefix-string
> > >  Sets the prefix string to be used by the 'prefix-region' command.
> > > +.It shell-command
> > > +Execute external command from mini-buffer.
> > >  .It shell-command-on-region
> > >  Provide the text in region to the shell command as input.
> > >  .It shrink-window
> > > Index: region.c
> > > ===================================================================
> > > RCS file: /cvs/src/usr.bin/mg/region.c,v
> > > retrieving revision 1.32
> > > diff -u -p -r1.32 region.c
> > > --- region.c      27 Dec 2012 18:49:59 -0000      1.32
> > > +++ region.c      21 May 2013 19:46:38 -0000
> > > @@ -28,6 +28,7 @@ static  int     iomux(int, char * const, int,
> > >  static   int     preadin(int, struct buffer *);
> > >  static   void    pwriteout(int, char **, int *);
> > >  static   int     setsize(struct region *, RSIZE);
> > > +static   int     shellcmdoutput(char * const[], char * const, int);
> > >  
> > >  /*
> > >   * Kill the region.  Ask "getregion" to figure out the bounds of the 
> > > region.
> > > @@ -406,9 +407,8 @@ int
> > >  piperegion(int f, int n)
> > >  {
> > >   struct region region;
> > > - struct buffer *bp;
> > > - int len, ret;
> > > - char *cmd, cmdbuf[NFILEN], *shellp, *text;
> > > + int len;
> > > + char *cmd, cmdbuf[NFILEN], *text;
> > >   char *argv[] = {"sh", "-c", (char *) NULL, (char *) NULL};
> > >  
> > >   /* C-u M-| is not supported yet */
> > > @@ -436,6 +436,51 @@ piperegion(int f, int n)
> > >           return (FALSE);
> > >   }
> > >  
> > > + region_get_data(&region, text, len);
> > > +
> > > + return shellcmdoutput(argv, text, len);
> > > +}
> > > +
> > > +/*
> > > + * Get command from mini-buffer and execute externally.
> > > + */
> > > +/*ARGSUSED */
> > > +int
> > > +shellcommand(int f, int n)
> > > +{
> > > +
> > > + int len;
> > > + char *cmd, cmdbuf[NFILEN], *text;
> > > + char *argv[] = {"sh", "-c", (char *) NULL, (char *) NULL};
> > > +
> > > + if (n > 1)
> > > +         return (ABORT);
> > > +
> > > + if ((cmd = eread("Shell command: ", cmdbuf, sizeof(cmdbuf),
> > > +     EFNEW | EFCR)) == NULL || (cmd[0] == '\0'))
> > > +         return (ABORT);
> > > +
> > > + argv[2] = cmd;
> > > +
> > > + len = strlen(cmd);
> > > +
> > > + if ((text = malloc(len + 1)) == NULL) {
> > > +         ewprintf("Cannot allocate memory.");
> > > +         return (FALSE);
> > > + }
> > > +
> > > + return shellcmdoutput(argv, NULL, 0);
> > > +}
> > > +
> > > +
> > > +int
> > > +shellcmdoutput(char* const argv[], char* const text, int len)
> > > +{
> > > +
> > > + struct buffer *bp;
> > > + char    *shellp;
> > > + int      ret;
> > > +
> > >   bp = bfind("*Shell Command Output*", TRUE);
> > >   bp->b_flag |= BFREADONLY;
> > >   if (bclear(bp) != TRUE) {
> > > @@ -443,7 +488,6 @@ piperegion(int f, int n)
> > >           return (FALSE);
> > >   }
> > >  
> > > - region_get_data(&region, text, len);
> > >   shellp = getenv("SHELL");
> > >  
> > >   ret = pipeio(shellp, argv, text, len, bp);
> > > 
> > 
> > -- 
> > Regards,
> > 
> > Jasper Lievisse Adriaanse,
> > Engineering team M:tier

-- 
Cheers,
Jasper

"Stay Hungry. Stay Foolish"

Reply via email to