make backspacing (and moving forward and backward) work perfectly

(in Emacs mode, of course) - for count=1 only though (yet)
This commit is contained in:
tg 2006-11-05 16:41:02 +00:00
parent 4787566fb6
commit cc261c7968
1 changed files with 17 additions and 15 deletions

32
edit.c
View File

@ -5,7 +5,7 @@
#include "sh.h" #include "sh.h"
__RCSID("$MirOS: src/bin/mksh/edit.c,v 1.41 2006/11/05 16:10:10 tg Exp $"); __RCSID("$MirOS: src/bin/mksh/edit.c,v 1.42 2006/11/05 16:41:02 tg Exp $");
/* tty driver characters we are interested in */ /* tty driver characters we are interested in */
typedef struct { typedef struct {
@ -1722,31 +1722,33 @@ x_del_char(int c __attribute__((unused)))
static void static void
x_delete(int nc, int push) x_delete(int nc, int push)
{ {
int i, j; int i, nb, nw;
char *cp; char *cp;
if (nc == 0) if (nc == 0)
return; return;
nw = 0;
cp = xcp;
for (i = 0; i < nc; ++i)
nw += x_size2(cp, &cp);
nb = cp - xcp;
if (xmp != NULL && xmp > xcp) { if (xmp != NULL && xmp > xcp) {
if (xcp + nc > xmp) if (xcp + nb > xmp)
xmp = xcp; xmp = xcp;
else else
xmp -= nc; xmp -= nb;
} }
/* /*
* This lets us yank a word we have deleted. * This lets us yank a word we have deleted.
*/ */
if (push) if (push)
x_push(nc); x_push(nb);
xep -= nc; xep -= nb;
cp = xcp; cp = xcp;
j = 0; memmove(xcp, xcp + nb, xep - xcp + 1); /* Copies the null */
i = nc;
while (i--) {
j += x_size2(cp, &cp);
}
memmove(xcp, xcp + nc, xep - xcp + 1); /* Copies the null */
x_adj_ok = 0; /* don't redraw */ x_adj_ok = 0; /* don't redraw */
x_zots(xcp); x_zots(xcp);
/* /*
@ -1755,11 +1757,11 @@ x_delete(int nc, int push)
* But if we must, make sure we do the minimum. * But if we must, make sure we do the minimum.
*/ */
if ((i = xx_cols - 2 - x_col) > 0) { if ((i = xx_cols - 2 - x_col) > 0) {
j = (j < i) ? j : i; nw = (nw < i) ? nw : i;
i = j; i = nw;
while (i--) while (i--)
x_e_putc2(' '); x_e_putc2(' ');
i = j; i = nw;
while (i--) while (i--)
x_e_putc2('\b'); x_e_putc2('\b');
} }