summaryrefslogtreecommitdiff
path: root/ted.c
diff options
context:
space:
mode:
Diffstat (limited to 'ted.c')
-rw-r--r--ted.c37
1 files 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:
{