* [9front] rio completion unlimited patch
@ 2022-06-01 20:52 Sigrid Solveig Haflínudóttir
0 siblings, 0 replies; 2+ messages in thread
From: Sigrid Solveig Haflínudóttir @ 2022-06-01 20:52 UTC (permalink / raw)
To: 9front
[-- 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);
^ permalink raw reply [flat|nested] 2+ messages in thread
* Re: [9front] rio completion unlimited patch
@ 2022-06-02 9:55 umbraticus
0 siblings, 0 replies; 2+ messages in thread
From: umbraticus @ 2022-06-02 9:55 UTC (permalink / raw)
To: 9front
nice, thanks!
I also wonder whether ^F should not cut the selection
(maybe put it in with the scrolling commands instead
of after) and scroll to make visible if you're off screen
(similar to another weird quirk: note how if scrolled
off top backspace does nothing but off bottom happily
deletes text—and in neither case jumps to cursor…)
umbraticus
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2022-06-02 9:58 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-06-01 20:52 [9front] rio completion unlimited patch Sigrid Solveig Haflínudóttir
2022-06-02 9:55 umbraticus
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).