I think it would be really neat to be able to send all the
text in a terminal to an external program, to act on it as
it likes.

I wrote a patch to do that, sending the contents of the
screen to the stdin of the chosen program.

One good use for this is writing a script to find any links,
and offer to open them in a browser using dmenu. A
particularly crude version of this could be:

#!/bin/sh
sed -e '/http/!d' -e 's/.*http/http/g' -e 's/ .*//g' | dmenu | xargs surf

There are a couple of things which need fixing / could do
with some discussion:

1) At present I commented out the SIGCHLD handler, as it was
blocking the process from returning. I confess to not being
overly familiar with the finer points of forking, so hope
someone better than me can suggest a fix.

2) This could be a feature that people would find useful to
trigger several different scripts. At present the key
binding is hardcoded (meta-|); should we add something to
be able to better define keybindings in config.h?
diff -r 1c8e6796c6fe config.def.h
--- a/config.def.h	Sun Aug 14 17:15:19 2011 +0200
+++ b/config.def.h	Thu Aug 25 15:40:02 2011 +0100
@@ -72,3 +72,5 @@
 /* double-click timeout (in milliseconds) between clicks for selection */
 #define DOUBLECLICK_TIMEOUT 300
 #define TRIPLECLICK_TIMEOUT (2*DOUBLECLICK_TIMEOUT)
+
+static const char *pipecmd[]  = { "pipetest.sh", NULL };
diff -r 1c8e6796c6fe st.c
--- a/st.c	Sun Aug 14 17:15:19 2011 +0200
+++ b/st.c	Thu Aug 25 15:40:02 2011 +0100
@@ -232,6 +232,8 @@
 static void selcopy(void);
 static void selpaste();
 
+static void extpipe();
+
 static int utf8decode(char *, long *);
 static int utf8encode(long *, char *);
 static int utf8size(char *);
@@ -607,6 +609,37 @@
 }
 
 void
+extpipe(const char **cmd) {
+	int fd[2], pid;
+
+	if(pipe(fd)) return;
+	pid = fork();
+
+	if(pid == -1) return;
+	if(pid == 0) { /* child */
+		close(fd[1]);
+		if(fd[0] != STDIN_FILENO) {
+			dup2(fd[0], STDIN_FILENO);
+			close(fd[0]);
+		}
+		execvp(cmd[0], (char **)cmd);
+		exit(0);
+	} else { /* parent */
+		int x, y;
+		close(fd[0]);
+
+		for(y = 0; y < term.row; y++) {
+			for(x = 0; x < term.col; x++) {
+				if(term.line[y][x].state & GLYPH_SET)
+					write(fd[1], term.line[y][x].c, utf8size(term.line[y][x].c));
+			}
+			write(fd[1], "\n", 1);
+		}
+		close(fd[1]);
+	}
+}
+
+void
 bmotion(XEvent *e) {
 	if(IS_SET(MODE_MOUSE)) {
 		mousereport(e);
@@ -684,7 +717,7 @@
 	default:
 		close(s);
 		cmdfd = m;
-		signal(SIGCHLD, sigchld);
+		//signal(SIGCHLD, sigchld);
 	}
 }
 
@@ -1877,6 +1910,10 @@
 			if(shift)
 				selpaste();
 			break;
+		case XK_bar:
+			if(meta)
+				extpipe(pipecmd);
+			break;
 		case XK_Return:
 			if(IS_SET(MODE_CRLF))
 				ttywrite("\r\n", 2);

Reply via email to