From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mimir.eigenstate.org ([206.124.132.107]) by ewsd; Thu Apr 9 00:14:53 EDT 2020 Received: from abbatoir.fios-router.home (pool-162-83-132-245.nycmny.fios.verizon.net [162.83.132.245]) by mimir.eigenstate.org (OpenSMTPD) with ESMTPSA id 679e3b87 (TLSv1.2:ECDHE-RSA-AES256-SHA:256:NO) for <9front@9front.org>; Wed, 8 Apr 2020 21:14:38 -0700 (PDT) Message-ID: <618C497B56559996D5CB5F02EF37BD27@eigenstate.org> To: 9front@9front.org Subject: vt plumbing: empty selection Date: Wed, 8 Apr 2020 21:14:36 -0700 From: ori@eigenstate.org MIME-Version: 1.0 Content-Type: text/plain; charset="US-ASCII" Content-Transfer-Encoding: 7bit List-ID: <9front.9front.org> List-Help: X-Glyph: ➈ X-Bullshit: extended just-in-time-scale dependency configuration extension Plumbing text in vt requires selecting the text that you want to plumb precisely. This patch makes plumbing behave the same way that it does in rio, though cwd isn't updated whenever we change directories. That'll take further thought to get right. There's an escape code (OSC 7) for programs to advertise their current working directory to the terminal emulator, and I'm willing to implement it -- but nothing on 9front generates it, and it's not clear that we want to start. The programs that do generate it are likely to be on the other end of an ssh connection, which means that their cwd is unlikely to make sense to plumb. Is there anything that is useful to do here? diff -r 3bcb5998f222 sys/src/cmd/vt/main.c --- a/sys/src/cmd/vt/main.c Wed Apr 08 23:48:09 2020 +0200 +++ b/sys/src/cmd/vt/main.c Wed Apr 08 21:07:46 2020 -0700 @@ -170,7 +170,7 @@ void escapedump(int,uchar *,int); void paste(void); void snarfsel(void); -void plumbsel(void); +void plumbsel(Point); static Channel *pidchan; @@ -982,13 +982,47 @@ free(s); } +/* + * Grabs the non-whitespace text around a character + * cell, matching the behavior in rio for plumbing. + * Does not modify the selection. + */ +char* +surrounding(Point p) +{ + int c, x0, x1; + char *s, *e; + + for(x0 = p.x; x0 > 0; x0--){ + c = *onscreenr(x0 - 1, p.y); + if(c == 0 || c == ' ' || c == '\t' || c == '\n') + break; + } + for(x1 = p.x; x1 <= xmax; x1++){ + c = *onscreenr(x1 + 1, p.y); + if(c == 0 || c == ' ' || c == '\t' || c == '\n') + break; + } + s = malloc((x1 - x0 + 1)*UTFmax); + if(s == nil || x0 == x1) + return nil; + e = selrange(s, x0, p.y, x1, p.y); + *e = 0; + for(e = s; *e; e++) + print("%c(%d)\n", *e, *e); + return s; +} + void -plumbsel(void) +plumbsel(Point p) { char *s, wdir[1024]; int plumb; - if((s = selection()) == nil) + s = selection(); + if(s == nil || *s == 0) + s = surrounding(p); + if(s == nil) return; if(getwd(wdir, sizeof wdir) == nil){ free(s); @@ -1116,6 +1150,9 @@ void readmenu(void) { + Point p; + + p = pos(mc->xy); if(button3()) { menu3.item[1] = ttystate[cs->raw].crnl ? "cr" : "crnl"; menu3.item[2] = ttystate[cs->raw].nlcr ? "nl" : "nlcr"; @@ -1173,7 +1210,7 @@ return; case Mplumb: - plumbsel(); + plumbsel(p); return; case Mpage: /* pause and clear at end of screen */