Mark Lumsden
unread,May 21, 2013, 4:04:10 PM5/21/13You do not have permission to delete messages in this group
Either email addresses are anonymous for this group or you need the view member email addresses permission to view the original message
to te...@openbsd.org
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
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);