diff -r fe61798f04a5 st.c --- a/st.c Sun Apr 03 21:40:33 2011 +0200 +++ b/st.c Tue Apr 05 13:01:54 2011 +0100 @@ -220,6 +220,7 @@ static inline int selected(int, int); static void selcopy(void); static void selpaste(void); +static void seledit(void); static int utf8decode(char *, long *); static int utf8encode(long *, char *); @@ -402,9 +403,86 @@ void bpress(XEvent *e) { - sel.mode = 1; - sel.ex = sel.bx = (e->xbutton.x - BORDER)/xw.cw; - sel.ey = sel.by = (e->xbutton.y - BORDER)/xw.ch; + if(e->xbutton.button == 2){ + seledit(); + }else{ + sel.mode = 1; + sel.ex = sel.bx = (e->xbutton.x - BORDER)/xw.cw; + sel.ey = sel.by = (e->xbutton.y - BORDER)/xw.ch; + } +} + +void +seledit(void) { + struct stat st; + char fname[64], cmd[128]; + char *env = getenv("TMPDIR"); + char *sel = NULL; + int fd; + int x, y; + + DEFAULT(env, "/tmp"); + snprintf(fname, sizeof fname, "%s/st_edXXXXXX", env); + + fd = mkstemp(fname); + if(fd == -1){ + perror("mkstemp()"); + return; + } + + for(y = 0; y < term.row; y++) { + for(x = 0; x < term.col; x++) + if(isprint(term.line[y][x].c[0])) /* FIXME: unicode */ + write(fd, term.line[y][x].c, utf8size(term.line[y][x].c)); + + write(fd, "\n", 1); + } + close(fd); + + env = getenv("VISUAL"); + DEFAULT(env, getenv("EDITOR")); + DEFAULT(env, "vi"); + + snprintf(cmd, sizeof cmd, "%s %s %s", EDIT_TERMINAL " -e", env, fname); + + signal(SIGCHLD, SIG_DFL); + if(system(cmd) != 0){ /* FIXME: manual fork() and wait() */ + signal(SIGCHLD, sigchld); + perror(cmd); + goto bail; + } + signal(SIGCHLD, sigchld); + + fd = open(fname, O_RDONLY); + if(fd == -1){ + perror(fname); + goto bail; + } + + if(fstat(fd, &st) != 0){ + perror("fstat()"); + goto bail; + } + + sel = malloc(st.st_size + 1); + if(!sel){ + perror("malloc()"); + goto bail; + } + + if(read(fd, sel, st.st_size) == -1){ + perror("read()"); + goto bail; + } + + sel[st.st_size] = '\0'; + xsetsel(sel); + sel = NULL; /* prevent sel.clip deallocation */ + +bail: + free(sel); + close(fd); + remove(fname); } void diff -r fe61798f04a5 config.def.h --- a/config.def.h Sun Apr 03 21:40:33 2011 +0200 +++ b/config.def.h Tue Apr 05 13:08:10 2011 +0100 @@ -4,6 +4,7 @@ #define BOLDFONT "-*-*-bold-r-*-*-*-120-75-75-*-60-*-*" #define BORDER 2 #define SHELL "/bin/sh" +#define EDIT_TERMINAL "st" /* Terminal colors */ static const char *colorname[] = {