To make the shell-command-on-region and this command behave like that requires another diff.
mark 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