parent
76864eb6cd
commit
65a5e5fe46
2 changed files with 19 additions and 2 deletions
|
|
@ -117,6 +117,7 @@ struct Window
|
||||||
uint q0;
|
uint q0;
|
||||||
uint q1;
|
uint q1;
|
||||||
uint qh;
|
uint qh;
|
||||||
|
uint iq1; /* last input position */
|
||||||
int id;
|
int id;
|
||||||
char name[32];
|
char name[32];
|
||||||
uint namecount;
|
uint namecount;
|
||||||
|
|
|
||||||
|
|
@ -623,10 +623,18 @@ wkeyctl(Window *w, Rune r)
|
||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
case Khome:
|
case Khome:
|
||||||
wshow(w, 0);
|
if(w->org > w->iq1) {
|
||||||
|
q0 = wbacknl(w, w->iq1, 1);
|
||||||
|
wsetorigin(w, q0, TRUE);
|
||||||
|
} else
|
||||||
|
wshow(w, 0);
|
||||||
return;
|
return;
|
||||||
case Kend:
|
case Kend:
|
||||||
wshow(w, w->nr);
|
if(w->iq1 > w->org+w->f.nchars) {
|
||||||
|
q0 = wbacknl(w, w->iq1, 1);
|
||||||
|
wsetorigin(w, q0, TRUE);
|
||||||
|
} else
|
||||||
|
wshow(w, w->nr);
|
||||||
return;
|
return;
|
||||||
case 0x01: /* ^A: beginning of line */
|
case 0x01: /* ^A: beginning of line */
|
||||||
if(w->q0==0 || w->q0==w->qh || w->r[w->q0-1]=='\n')
|
if(w->q0==0 || w->q0==w->qh || w->r[w->q0-1]=='\n')
|
||||||
|
|
@ -689,6 +697,7 @@ wkeyctl(Window *w, Rune r)
|
||||||
w->qh = w->nr;
|
w->qh = w->nr;
|
||||||
wshow(w, w->qh);
|
wshow(w, w->qh);
|
||||||
winterrupt(w);
|
winterrupt(w);
|
||||||
|
w->iq1 = w->q0;
|
||||||
return;
|
return;
|
||||||
case 0x06: /* ^F: file name completion */
|
case 0x06: /* ^F: file name completion */
|
||||||
case Kins: /* Insert: file name completion */
|
case Kins: /* Insert: file name completion */
|
||||||
|
|
@ -699,6 +708,7 @@ wkeyctl(Window *w, Rune r)
|
||||||
q0 = w->q0;
|
q0 = w->q0;
|
||||||
q0 = winsert(w, rp, nr, q0);
|
q0 = winsert(w, rp, nr, q0);
|
||||||
wshow(w, q0+nr);
|
wshow(w, q0+nr);
|
||||||
|
w->iq1 = w->q0;
|
||||||
free(rp);
|
free(rp);
|
||||||
return;
|
return;
|
||||||
case 0x08: /* ^H: erase character */
|
case 0x08: /* ^H: erase character */
|
||||||
|
|
@ -717,12 +727,14 @@ wkeyctl(Window *w, Rune r)
|
||||||
wdelete(w, q0, q0+nb);
|
wdelete(w, q0, q0+nb);
|
||||||
wsetselect(w, q0, q0);
|
wsetselect(w, q0, q0);
|
||||||
}
|
}
|
||||||
|
w->iq1 = w->q0;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
/* otherwise ordinary character; just insert */
|
/* otherwise ordinary character; just insert */
|
||||||
q0 = w->q0;
|
q0 = w->q0;
|
||||||
q0 = winsert(w, &r, 1, q0);
|
q0 = winsert(w, &r, 1, q0);
|
||||||
wshow(w, q0+1);
|
wshow(w, q0+1);
|
||||||
|
w->iq1 = w->q0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
|
@ -921,6 +933,8 @@ wdelete(Window *w, uint q0, uint q1)
|
||||||
return;
|
return;
|
||||||
runemove(w->r+q0, w->r+q1, w->nr-q1);
|
runemove(w->r+q0, w->r+q1, w->nr-q1);
|
||||||
w->nr -= n;
|
w->nr -= n;
|
||||||
|
if(q0 < w->iq1)
|
||||||
|
w->iq1 -= min(n, w->iq1-q0);
|
||||||
if(q0 < w->q0)
|
if(q0 < w->q0)
|
||||||
w->q0 -= min(n, w->q0-q0);
|
w->q0 -= min(n, w->q0-q0);
|
||||||
if(q0 < w->q1)
|
if(q0 < w->q1)
|
||||||
|
|
@ -1609,6 +1623,8 @@ winsert(Window *w, Rune *r, int n, uint q0)
|
||||||
w->qh += n;
|
w->qh += n;
|
||||||
if(q0 < w->org)
|
if(q0 < w->org)
|
||||||
w->org += n;
|
w->org += n;
|
||||||
|
if(q0 < w->iq1)
|
||||||
|
w->iq1 += n;
|
||||||
else if(q0 <= w->org+w->f.nchars)
|
else if(q0 <= w->org+w->f.nchars)
|
||||||
frinsert(&w->f, r, r+n, q0-w->org);
|
frinsert(&w->f, r, r+n, q0-w->org);
|
||||||
return q0;
|
return q0;
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue