From 46ff9f2e0178ecf7ce473d88a00ae63c4a7851c5 Mon Sep 17 00:00:00 2001 From: Johnny Richard Date: Tue, 26 Apr 2022 03:33:03 +0200 Subject: Implement home and end keys movement --- ted.c | 37 ++++++++++++++++++++++++------------- 1 file changed, 24 insertions(+), 13 deletions(-) diff --git a/ted.c b/ted.c index 4568719..739a1a5 100644 --- a/ted.c +++ b/ted.c @@ -36,6 +36,8 @@ enum editor_key { ARROW_RIGHT, ARROW_UP, ARROW_DOWN, + HOME_KEY, + END_KEY, PAGE_UP, PAGE_DOWN }; @@ -94,31 +96,26 @@ editor_read_key() int nread; char c; while ((nread = read(STDIN_FILENO, &c, 1)) != 1) { - if (nread == -1 && errno != EAGAIN) { - die("read"); - } + if (nread == -1 && errno != EAGAIN) die("read"); } if (c == '\x1b') { char seq[3]; - if (read(STDIN_FILENO, &seq[0], 1) != 1) { - return '\x1b'; - } - - if (read(STDIN_FILENO, &seq[1], 1) != 1) { - return '\x1b'; - } + if (read(STDIN_FILENO, &seq[0], 1) != 1) return '\x1b'; + if (read(STDIN_FILENO, &seq[1], 1) != 1) return '\x1b'; if (seq[0] == '[') { if (seq[1] >= '0' && seq[1] <= '9') { - if (read(STDIN_FILENO, &seq[2], 1) != 1) { - return '\x1b'; - } + if (read(STDIN_FILENO, &seq[2], 1) != 1) return '\x1b'; if (seq[2] == '~') { switch (seq[1]) { + case '1': return HOME_KEY; + case '4': return END_KEY; case '5': return PAGE_UP; case '6': return PAGE_DOWN; + case '7': return HOME_KEY; + case '8': return END_KEY; } } } else { @@ -127,9 +124,17 @@ editor_read_key() case 'B': return ARROW_DOWN; case 'C': return ARROW_RIGHT; case 'D': return ARROW_LEFT; + case 'H': return HOME_KEY; + case 'F': return END_KEY; } } + } else if (seq[0] == 'O') { + switch (seq[1]) { + case 'H': return HOME_KEY; + case 'F': return END_KEY; + } } + return '\x1b'; } else { return c; @@ -221,6 +226,12 @@ editor_process_key(editor_config_t *ec) editor_clear_screen(); exit(EXIT_SUCCESS); break; + case HOME_KEY: + ec->cx = 0; + break; + case END_KEY: + ec->cx = ec->screen_cols - 1; + break; case PAGE_UP: case PAGE_DOWN: { -- cgit v1.2.3