9front - general discussion about 9front
 help / color / mirror / Atom feed
From: "Sigrid Solveig Haflínudóttir" <ftrvxmtrx@gmail.com>
To: <9front@9front.org>
Subject: [9front] rio completion unlimited patch
Date: Wed, 01 Jun 2022 22:52:50 +0200	[thread overview]
Message-ID: <CKF3GI412X7Q.2XNY7NA9EVDS0@reform> (raw)


[-- Attachment #1.1: Type: text/plain, Size: 553 bytes --]

A patch I've been using for a few days now, thought maybe
someone else will find it useful as well.

Without the patch, Ctrl+F (or Insert) triggers file name
completion, but when you have more than 32 matching items,
it just prints "[XX files]" and gives up. This patch adds
to the behavior: rio provides more and more matching items
if you continue pressing Ctrl+F, despite the initial
message. It stops when the current completion does not
give results anymore, so as not to spam with duplicates
if your key repeat rate is as high as mine.

[-- Attachment #2.1: Type: text/plain, Size: 363 bytes --]

from postmaster@9front:
The following attachment had content that we can't
prove to be harmless.  To avoid possible automatic
execution, we changed the content headers.
The original header was:

	Content-Transfer-Encoding: base64
	Content-Disposition: attachment; filename=rio-completion.patch
	Content-Type: text/x-patch; charset=utf-8; name=rio-completion.patch

[-- Attachment #2.2: rio-completion.patch.suspect --]
[-- Type: application/octet-stream, Size: 3620 bytes --]

diff b75e549126641108880a24a4ff0b38171eb1a856 uncommitted
--- a/sys/src/cmd/rio/dat.h
+++ b/sys/src/cmd/rio/dat.h
@@ -136,6 +137,7 @@
 	Channel		*kbdread;	/* chan(Consreadmesg) */
 	Channel		*complete;	/* chan(Completion*) */
 	Channel		*gone;		/* chan(char*) */
+	int			ncomplete;
 	uint			nr;			/* number of runes in window */
 	uint			maxr;		/* number of runes allocated in r */
 	Rune			*r;
--- a/sys/src/cmd/rio/wind.c
+++ b/sys/src/cmd/rio/wind.c
@@ -242,6 +242,40 @@
 }
 
 static void
+wdelete(Window *w, uint q0, uint q1)
+{
+	uint n, p0, p1;
+
+	n = q1-q0;
+	if(n == 0)
+		return;
+	runemove(w->r+q0, w->r+q1, w->nr-q1);
+	w->nr -= n;
+	if(q0 < w->q0)
+		w->q0 -= min(n, w->q0-q0);
+	if(q0 < w->q1)
+		w->q1 -= min(n, w->q1-q0);
+	if(q1 < w->qh)
+		w->qh -= n;
+	else if(q0 < w->qh)
+		w->qh = q0;
+	if(q1 <= w->org)
+		w->org -= n;
+	else if(q0 < w->org+w->nchars){
+		p1 = q1 - w->org;
+		if(p1 > w->nchars)
+			p1 = w->nchars;
+		if(q0 < w->org){
+			w->org = q0;
+			p0 = 0;
+		}else
+			p0 = q0 - w->org;
+		frdelete(w, p0, p1);
+		wfill(w);
+	}
+}
+
+static void
 wsetselect(Window *w, uint q0, uint q1)
 {
 	int p0, p1;
@@ -519,7 +540,7 @@
 static void
 showcandidates(Window *w, Completion *c)
 {
-	int i;
+	int i, n, i0, toomuch;
 	Fmt f;
 	Rune *rp;
 	uint nr, qline;
@@ -526,20 +547,28 @@
 	char *s;
 
 	runefmtstrinit(&f);
+	toomuch = c->nfile > 32;
+	n = w->ncomplete++;
 	if (c->nmatch == 0)
 		s = "[no matches in ";
 	else
-		s = "[";
-	if(c->nfile > 32)
+		s = (n<1 || (toomuch && n==1)) ? "[" : "";
+	if(toomuch && n < 1)
 		fmtprint(&f, "%s%d files]\n", s, c->nfile);
 	else{
 		fmtprint(&f, "%s", s);
-		for(i=0; i<c->nfile; i++){
+		n -= toomuch;
+		i0 = n*33;
+		for(i=i0; i<c->nfile && i<(n+1)*33; i++){
 			if(i > 0)
 				fmtprint(&f, " ");
 			fmtprint(&f, "%s", c->filename[i]);
 		}
-		fmtprint(&f, "]\n");
+		if(i==i0){
+			free(runefmtstrflush(&f));
+			return;
+		}
+		fmtprint(&f, i>=c->nfile ? "]\n" : " …\n");
 	}
 	rp = runefmtstrflush(&f);
 	nr = runestrlen(rp);
@@ -553,6 +582,10 @@
 		/* advance host point to avoid readback */
 		w->qh = winsert(w, rp, nr, qline)+nr;
 	} else {
+		if(qline>2 && w->r[qline-2]==L'…' && w->r[qline-3]==' '){
+			qline -= 3;
+			wdelete(w, qline, qline+3);
+		}
 		winsert(w, rp, nr, qline);
 	}
 	free(rp);
@@ -709,40 +742,6 @@
 	wshow(w, w->nr);
 }
 
-static void
-wdelete(Window *w, uint q0, uint q1)
-{
-	uint n, p0, p1;
-
-	n = q1-q0;
-	if(n == 0)
-		return;
-	runemove(w->r+q0, w->r+q1, w->nr-q1);
-	w->nr -= n;
-	if(q0 < w->q0)
-		w->q0 -= min(n, w->q0-q0);
-	if(q0 < w->q1)
-		w->q1 -= min(n, w->q1-q0);
-	if(q1 < w->qh)
-		w->qh -= n;
-	else if(q0 < w->qh)
-		w->qh = q0;
-	if(q1 <= w->org)
-		w->org -= n;
-	else if(q0 < w->org+w->nchars){
-		p1 = q1 - w->org;
-		if(p1 > w->nchars)
-			p1 = w->nchars;
-		if(q0 < w->org){
-			w->org = q0;
-			p0 = 0;
-		}else
-			p0 = q0 - w->org;
-		frdelete(w, p0, p1);
-		wfill(w);
-	}
-}
-
 void
 wcut(Window *w)
 {
@@ -859,6 +858,8 @@
 
 	if(w->i==nil)
 		return;
+	if(r != Kack && r != Kins)
+		w->ncomplete = 0;
 	/* navigation keys work only when mouse and kbd is not open */
 	if(!w->mouseopen)
 		switch(r){
@@ -1472,6 +1482,8 @@
 
 	incref(w);		/* hold up window while we track */
 	if(w->i != nil){
+		if(but < 4)
+			w->ncomplete = 0;
 		if(shiftdown && but > 3)
 			wkeyctl(w, but == 4 ? Kscrolloneup : Kscrollonedown);
 		else if(ptinrect(w->mc.xy, w->scrollr) || (but > 3))
@@ -1743,6 +1754,7 @@
 				if(!cr->advance)
 					showcandidates(w, cr);
 				if(cr->advance){
+					w->ncomplete = 0;
 					rp = runesmprint("%s", cr->string);
 					if(rp){
 						nr = runestrlen(rp);

             reply	other threads:[~2022-06-01 20:54 UTC|newest]

Thread overview: 2+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-06-01 20:52 Sigrid Solveig Haflínudóttir [this message]
2022-06-02  9:55 umbraticus

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=CKF3GI412X7Q.2XNY7NA9EVDS0@reform \
    --to=ftrvxmtrx@gmail.com \
    --cc=9front@9front.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).