windows: Support word-based move/delete key sequences for REPL.

Translate common Ctrl-Left/Right/Delete/Backspace to the EMACS-style
sequences (i.e. Alt key based) for forward-word, backward-word, forwad-kill
and backward-kill.  Requires MICROPY_REPL_EMACS_WORDS_MOVE to be defined so
the readline implementation interprets these.
v1.13-wasp-os
stijn 2020-01-13 12:11:27 +01:00 committed by Damien George
parent a55c17dc69
commit 599371b133
1 changed files with 18 additions and 7 deletions

View File

@ -141,7 +141,7 @@ typedef struct item_t {
const char *seq;
} item_t;
// map virtual key codes to VT100 escape sequences
// map virtual key codes to key sequences known by MicroPython's readline implementation
STATIC item_t keyCodeMap[] = {
{VK_UP, "[A"},
{VK_DOWN, "[B"},
@ -153,10 +153,19 @@ STATIC item_t keyCodeMap[] = {
{0, ""} //sentinel
};
// likewise, but with Ctrl key down
STATIC item_t ctrlKeyCodeMap[] = {
{VK_LEFT, "b"},
{VK_RIGHT, "f"},
{VK_DELETE, "d"},
{VK_BACK, "\x7F"},
{0, ""} //sentinel
};
STATIC const char *cur_esc_seq = NULL;
STATIC int esc_seq_process_vk(int vk) {
for (item_t *p = keyCodeMap; p->vkey != 0; ++p) {
STATIC int esc_seq_process_vk(WORD vk, bool ctrl_key_down) {
for (item_t *p = (ctrl_key_down ? ctrlKeyCodeMap : keyCodeMap); p->vkey != 0; ++p) {
if (p->vkey == vk) {
cur_esc_seq = p->seq;
return 27; // ESC, start of escape sequence
@ -194,14 +203,16 @@ int mp_hal_stdin_rx_chr(void) {
if (rec.EventType != KEY_EVENT || !rec.Event.KeyEvent.bKeyDown) { // only want key down events
continue;
}
const bool ctrl_key_down = (rec.Event.KeyEvent.dwControlKeyState & LEFT_CTRL_PRESSED) ||
(rec.Event.KeyEvent.dwControlKeyState & RIGHT_CTRL_PRESSED);
const int ret = esc_seq_process_vk(rec.Event.KeyEvent.wVirtualKeyCode, ctrl_key_down);
if (ret) {
return ret;
}
const char c = rec.Event.KeyEvent.uChar.AsciiChar;
if (c) { // plain ascii char, return it
return c;
}
const int ret = esc_seq_process_vk(rec.Event.KeyEvent.wVirtualKeyCode);
if (ret) {
return ret;
}
}
}