diff options
author | Johnny Richard <johnny@johnnyrichard.com> | 2022-04-26 03:33:03 +0200 |
---|---|---|
committer | Johnny Richard <johnny@johnnyrichard.com> | 2022-04-26 03:33:03 +0200 |
commit | 46ff9f2e0178ecf7ce473d88a00ae63c4a7851c5 (patch) | |
tree | 55051680ed5cb8525360144d944b73484202de02 | |
parent | 2ff134c08e2c1ca342719314776d3c63c4226c8b (diff) |
Implement home and end keys movement
-rw-r--r-- | ted.c | 37 |
1 files changed, 24 insertions, 13 deletions
@@ -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: { |