Patch from mksh to make delete key work (closes: #190566) Index: pdksh-5.2.14/emacs.c =================================================================== --- pdksh-5.2.14.orig/emacs.c 2009-09-15 20:59:29.000000000 +0200 +++ pdksh-5.2.14/emacs.c 2009-09-15 21:06:50.000000000 +0200 @@ -327,6 +327,26 @@ { XFUNC_next_com, 2, 'B' }, { XFUNC_mv_forw, 2, 'C' }, { XFUNC_mv_back, 2, 'D' }, + /* These for ansi arrow keys: arguablely shouldn't be here by + * default, but its simpler/faster/smaller than using termcap + * entries. + */ + { XFUNC_meta2, 1, '[' }, + { XFUNC_meta2, 1, 'O' }, + { XFUNC_prev_com, 2, 'A' }, + { XFUNC_next_com, 2, 'B' }, + { XFUNC_mv_forw, 2, 'C' }, + { XFUNC_mv_back, 2, 'D' }, + { XFUNC_mv_begin | 0x80, 2, '1' }, + { XFUNC_mv_begin | 0x80, 2, '7' }, + { XFUNC_mv_begin, 2, 'H' }, + { XFUNC_mv_end | 0x80, 2, '4' }, + { XFUNC_mv_end | 0x80, 2, '8' }, + { XFUNC_mv_end, 2, 'F' }, + { XFUNC_del_char | 0x80, 2, '3' }, + { XFUNC_prev_com | 0x80, 2, '5' }, + { XFUNC_next_com | 0x80, 2, '6' }, + }; int @@ -371,7 +391,14 @@ return 0; f = x_curprefix == -1 ? XFUNC_insert - : x_tab[x_curprefix][c&CHARMASK]; + : x_tab[x_curprefix][c&CHARMASK] ; + + if (f & 0x80) { + f &= 0x7F; + if ((i = x_e_getc()) != '~') + x_e_ungetc(i); + } + if (!(x_ftab[f].xf_flags & XF_PREFIX) && x_last_command != XFUNC_set_arg) @@ -1385,6 +1412,7 @@ x_print(prefix, key) int prefix, key; { + int f = x_tab[prefix][key]; if (prefix == 1) shprintf("%s", x_mapout(x_prefix1)); if (prefix == 2) @@ -1393,9 +1421,9 @@ if (prefix == 3) shprintf("%s", x_mapout(x_prefix3)); #endif /* OS2 */ - shprintf("%s = ", x_mapout(key)); - if (x_tab[prefix][key] != XFUNC_ins_string) - shprintf("%s\n", x_ftab[x_tab[prefix][key]].xf_name); + shprintf("%s%s = ", x_mapout(key), (f & 0x80) ? "~" : ""); + if ((f & 0x7F) != XFUNC_ins_string) + shprintf("%s\n", x_ftab[f & 0x7F].xf_name); else shprintf("'%s'\n", x_atab[prefix][key]); } @@ -1410,6 +1438,7 @@ int prefix, key; char *sp = NULL; char *m1, *m2; + char hastilde; if (x_tab == NULL) { bi_errorf("cannot bind, not a tty"); @@ -1437,7 +1466,7 @@ return 0; } - m1 = x_mapin(a1); + m2 = m1 = x_mapin(a1); prefix = key = 0; for (;; m1++) { key = *m1 & CHARMASK; @@ -1453,6 +1482,19 @@ break; } + if (*++m1 && ((*m1 != '~') || *(m1+1))) { + char msg[256] = "key sequence '"; + const char *c = a1; + m1 = msg + strlen(msg); + while (*c && m1 < (msg + sizeof(msg) - 3)) + strcat(msg, x_mapout(*c++)); + bi_errorf("%s' too long", msg); + return (1); + } + + hastilde = *m1; + afree(m2, ATEMP); + if (a2 == NULL) { x_print(prefix, key); return 0; @@ -1483,7 +1525,7 @@ if (x_tab[prefix][key] == XFUNC_ins_string && x_atab[prefix][key]) afree((void *)x_atab[prefix][key], AEDIT); - x_tab[prefix][key] = f; + x_tab[prefix][key] = f | (hastilde ? 0x80 : 0); x_atab[prefix][key] = sp; /* Track what the user has bound so x_emacs_keys() won't toast things */