Support arrow keys on emacs/vi mode on OS/2
This commit is contained in:
66
edit.c
66
edit.c
@ -135,6 +135,11 @@ x_read(char *buf)
|
|||||||
static int
|
static int
|
||||||
x_getc(void)
|
x_getc(void)
|
||||||
{
|
{
|
||||||
|
#ifdef __OS2__
|
||||||
|
int c = _read_kbd(0, 1, 0);
|
||||||
|
|
||||||
|
return c == 0 ? 0xE0 : c;
|
||||||
|
#else
|
||||||
char c;
|
char c;
|
||||||
ssize_t n;
|
ssize_t n;
|
||||||
|
|
||||||
@ -156,6 +161,7 @@ x_getc(void)
|
|||||||
x_mode(true);
|
x_mode(true);
|
||||||
}
|
}
|
||||||
return ((n == 1) ? (int)(unsigned char)c : -1);
|
return ((n == 1) ? (int)(unsigned char)c : -1);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@ -887,7 +893,11 @@ struct x_defbindings {
|
|||||||
/* Separator for motion */
|
/* Separator for motion */
|
||||||
#define is_mfs(c) (!(ksh_isalnux(c) || (c) == '$' || ((c) & 0x80)))
|
#define is_mfs(c) (!(ksh_isalnux(c) || (c) == '$' || ((c) & 0x80)))
|
||||||
|
|
||||||
|
#ifndef __OS2__
|
||||||
#define X_NTABS 3 /* normal, meta1, meta2 */
|
#define X_NTABS 3 /* normal, meta1, meta2 */
|
||||||
|
#else
|
||||||
|
#define X_NTABS 4 /* normal, meta1, meta2, meta3 */
|
||||||
|
#endif
|
||||||
#define X_TABSZ 256 /* size of keydef tables etc */
|
#define X_TABSZ 256 /* size of keydef tables etc */
|
||||||
|
|
||||||
/*-
|
/*-
|
||||||
@ -1091,6 +1101,13 @@ static struct x_defbindings const x_defbindings[] = {
|
|||||||
{ XFUNC_next_com, 2, 'B' },
|
{ XFUNC_next_com, 2, 'B' },
|
||||||
{ XFUNC_mv_forw, 2, 'C' },
|
{ XFUNC_mv_forw, 2, 'C' },
|
||||||
{ XFUNC_mv_back, 2, 'D' },
|
{ XFUNC_mv_back, 2, 'D' },
|
||||||
|
#ifdef __OS2__
|
||||||
|
{ XFUNC_meta3, 0, 0xE0 },
|
||||||
|
{ XFUNC_prev_com, 3, 'H' },
|
||||||
|
{ XFUNC_next_com, 3, 'P' },
|
||||||
|
{ XFUNC_mv_forw, 3, 'M' },
|
||||||
|
{ XFUNC_mv_back, 3, 'K' },
|
||||||
|
#endif
|
||||||
#ifndef MKSH_SMALL
|
#ifndef MKSH_SMALL
|
||||||
{ XFUNC_vt_hack, 2, '1' },
|
{ XFUNC_vt_hack, 2, '1' },
|
||||||
{ XFUNC_mv_begin | 0x80, 2, '7' },
|
{ XFUNC_mv_begin | 0x80, 2, '7' },
|
||||||
@ -2215,6 +2232,15 @@ x_meta2(int c MKSH_A_UNUSED)
|
|||||||
return (KSTD);
|
return (KSTD);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef __OS2__
|
||||||
|
static int
|
||||||
|
x_meta3(int c MKSH_A_UNUSED)
|
||||||
|
{
|
||||||
|
x_curprefix = 3;
|
||||||
|
return (KSTD);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
static int
|
static int
|
||||||
x_kill(int c MKSH_A_UNUSED)
|
x_kill(int c MKSH_A_UNUSED)
|
||||||
{
|
{
|
||||||
@ -2365,6 +2391,12 @@ x_mapin(const char *cp, Area *ap)
|
|||||||
/* XXX -- should handle \^ escape? */
|
/* XXX -- should handle \^ escape? */
|
||||||
if (*cp == '^') {
|
if (*cp == '^') {
|
||||||
cp++;
|
cp++;
|
||||||
|
#ifdef __OS2__
|
||||||
|
/* define function keys */
|
||||||
|
if (*cp == '0')
|
||||||
|
*op++ = 0xE0;
|
||||||
|
else
|
||||||
|
#endif
|
||||||
/*XXX or ^^ escape? this is ugly. */
|
/*XXX or ^^ escape? this is ugly. */
|
||||||
if (*cp >= '?')
|
if (*cp >= '?')
|
||||||
/* includes '?'; ASCII */
|
/* includes '?'; ASCII */
|
||||||
@ -2387,6 +2419,12 @@ x_mapout2(int c, char **buf)
|
|||||||
{
|
{
|
||||||
char *p = *buf;
|
char *p = *buf;
|
||||||
|
|
||||||
|
#ifdef __OS2__
|
||||||
|
if (c == 0xE0) {
|
||||||
|
*p++ = '^';
|
||||||
|
*p++ = '0';
|
||||||
|
} else
|
||||||
|
#endif
|
||||||
if (ISCTRL(c)) {
|
if (ISCTRL(c)) {
|
||||||
*p++ = '^';
|
*p++ = '^';
|
||||||
*p++ = UNCTRL(c);
|
*p++ = UNCTRL(c);
|
||||||
@ -2411,6 +2449,11 @@ x_print(int prefix, int key)
|
|||||||
{
|
{
|
||||||
int f = x_tab[prefix][key];
|
int f = x_tab[prefix][key];
|
||||||
|
|
||||||
|
#ifdef __OS2__
|
||||||
|
if (prefix == 3)
|
||||||
|
shf_puts(x_mapout(0xE0), shl_stdout);
|
||||||
|
else
|
||||||
|
#endif
|
||||||
if (prefix)
|
if (prefix)
|
||||||
/* prefix == 1 || prefix == 2 */
|
/* prefix == 1 || prefix == 2 */
|
||||||
shf_puts(x_mapout(prefix == 1 ?
|
shf_puts(x_mapout(prefix == 1 ?
|
||||||
@ -2479,6 +2522,10 @@ x_bind(const char *a1, const char *a2,
|
|||||||
prefix = 1;
|
prefix = 1;
|
||||||
else if (f == XFUNC_meta2)
|
else if (f == XFUNC_meta2)
|
||||||
prefix = 2;
|
prefix = 2;
|
||||||
|
#ifdef __OS2__
|
||||||
|
else if (f == XFUNC_meta3)
|
||||||
|
prefix = 3;
|
||||||
|
#endif
|
||||||
else
|
else
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -3610,8 +3657,24 @@ vi_hook(int ch)
|
|||||||
}
|
}
|
||||||
switch (vi_insert(ch)) {
|
switch (vi_insert(ch)) {
|
||||||
case -1:
|
case -1:
|
||||||
|
#ifdef __OS2__
|
||||||
|
/* arrow keys generate 0xe0X, where X is H.. */
|
||||||
|
state = VCMD;
|
||||||
|
argc1 = 1;
|
||||||
|
switch (x_getc()) {
|
||||||
|
case 'H': *curcmd='k'; break;
|
||||||
|
case 'K': *curcmd='h'; break;
|
||||||
|
case 'P': *curcmd='j'; break;
|
||||||
|
case 'M': *curcmd='l'; break;
|
||||||
|
default:
|
||||||
|
vi_error();
|
||||||
|
state = VNORMAL;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
#else
|
||||||
vi_error();
|
vi_error();
|
||||||
state = VNORMAL;
|
state = VNORMAL;
|
||||||
|
#endif
|
||||||
break;
|
break;
|
||||||
case 0:
|
case 0:
|
||||||
if (state == VLIT) {
|
if (state == VLIT) {
|
||||||
@ -3970,6 +4033,9 @@ vi_insert(int ch)
|
|||||||
if (first_insert && ch != CTRL('['))
|
if (first_insert && ch != CTRL('['))
|
||||||
saved_inslen = 0;
|
saved_inslen = 0;
|
||||||
switch (ch) {
|
switch (ch) {
|
||||||
|
#ifdef __OS2__
|
||||||
|
case 0xE0: /* function key prefix */
|
||||||
|
#endif
|
||||||
case '\0':
|
case '\0':
|
||||||
return (-1);
|
return (-1);
|
||||||
|
|
||||||
|
@ -52,6 +52,9 @@ FN(list_file, "list-file", 0)
|
|||||||
FN(literal, "quote", 0)
|
FN(literal, "quote", 0)
|
||||||
FN(meta1, "prefix-1", XF_PREFIX)
|
FN(meta1, "prefix-1", XF_PREFIX)
|
||||||
FN(meta2, "prefix-2", XF_PREFIX)
|
FN(meta2, "prefix-2", XF_PREFIX)
|
||||||
|
#ifdef __OS2__
|
||||||
|
FN(meta3, "prefix-3", XF_PREFIX)
|
||||||
|
#endif
|
||||||
FN(meta_yank, "yank-pop", 0)
|
FN(meta_yank, "yank-pop", 0)
|
||||||
FN(mv_back, "backward-char", XF_ARG)
|
FN(mv_back, "backward-char", XF_ARG)
|
||||||
FN(mv_begin, "beginning-of-line", 0)
|
FN(mv_begin, "beginning-of-line", 0)
|
||||||
|
Reference in New Issue
Block a user