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(®ion, 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(®ion, 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"