From 7a8982cf19765308b43794ff7f754f1a6d8f4cac Mon Sep 17 00:00:00 2001 From: sloumdrone Date: Sat, 28 Dec 2019 18:21:29 -0800 Subject: [PATCH] Got most keys added to basic key handling --- csedit | Bin 13768 -> 17904 bytes csedit.c | 93 +++++++++++++++++++++++++++++++++++++++++++------------ notes.md | 42 +++++++++++++++++++++++++ 3 files changed, 115 insertions(+), 20 deletions(-) create mode 100644 notes.md diff --git a/csedit b/csedit index 21523fded2a39e9a2250affc436ba441af277d2d..6f9a3620c1273545e1fc073465c81b6a9cf013f8 100755 GIT binary patch delta 5647 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 agPXvN{G}5Nsh&RpsjJqIe&D|5>i+_WA+KTp diff --git a/csedit.c b/csedit.c index 9944533..b56e89c 100644 --- a/csedit.c +++ b/csedit.c @@ -18,14 +18,16 @@ enum editorMode {CommandMode, InputMode, VisualMode}; enum editorKey { + BACKSPACE = 127, ARROW_LEFT = 1000, ARROW_RIGHT, ARROW_UP, ARROW_DOWN, PAGE_UP, PAGE_DOWN, - DELETE, - BACKSPACE + DEL_KEY, + HOME_KEY, + END_KEY }; // @@ -92,11 +94,33 @@ int editorReadKey() { if (read(STDIN_FILENO, &seq[0], 1) != 1) return '\033'; if (read(STDIN_FILENO, &seq[1], 1) != 1) return '\033'; if (seq[0] == '[') { + if (seq[1] >= '0' && seq[1] <= '9') { + if (read(STDIN_FILENO, &seq[2], 1) != 1) return '\033'; + if (seq[2] == '~') { + switch (seq[1]) { + case '1': return HOME_KEY; + case '3': return DEL_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 { + switch (seq[1]) { + case 'A': return ARROW_UP; + 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 'A': return ARROW_UP; - 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; } } return '\033'; @@ -236,14 +260,16 @@ void editorMoveCursor(int key) { } } +void editorPageCursor(int key) { + if (key == PAGE_UP || key == PAGE_DOWN) { + int times = E.screenRows; + while (times--) + editorMoveCursor(key == PAGE_UP ? ARROW_UP : ARROW_DOWN); + } +} + void editorInputKp(int c) { switch (c) { - case ARROW_DOWN: - case ARROW_UP: - case ARROW_LEFT: - case ARROW_RIGHT: - editorMoveCursor(c); - break; case '\033': E.mode = CommandMode; default: @@ -253,23 +279,29 @@ void editorInputKp(int c) { void editorCommandKp(int c) { switch (c) { - case 'q': - quit(); - break; case 'j': case 'k': case 'h': case 'l': - case ARROW_DOWN: - case ARROW_UP: - case ARROW_LEFT: - case ARROW_RIGHT: editorMoveCursor(c); break; case 'i': E.mode = InputMode; + break; + case 'u': + editorPageCursor(PAGE_UP); + break; + case 'd': + editorPageCursor(PAGE_DOWN); + break; + case '$': + E.cx = E.screenCols - 1; + break; + case '0': + case '^': + E.cx = 0; + break; } - } void editorProcessKeypress() { @@ -278,6 +310,27 @@ void editorProcessKeypress() { case CTRL_KEY('q'): quit(); break; + case ARROW_DOWN: + case ARROW_UP: + case ARROW_LEFT: + case ARROW_RIGHT: + editorMoveCursor(c); + return; + case PAGE_UP: + case PAGE_DOWN: + editorPageCursor(c); + return; + case CTRL_KEY('u'): + editorPageCursor(PAGE_UP); + return; + case CTRL_KEY('d'): + editorPageCursor(PAGE_DOWN); + return; + case HOME_KEY: + E.cx = 0; + break; + case END_KEY: + E.cx = E.screenCols - 1; } if (E.mode == CommandMode) { diff --git a/notes.md b/notes.md new file mode 100644 index 0000000..f10067a --- /dev/null +++ b/notes.md @@ -0,0 +1,42 @@ +## simple + +g - top of document +G - bottom of document +^ - beginning of text in row +0 - beginning of row +$ - end of row +hjkl - movement +o - open row below in insert +O - open row above in insert +w - next word +e - end of word +a - enter insert mode after current position +i - enter insert mode +u - page up +d - page down + - enter command mode +^s - save +^S - save as +^o - open file + + + + + + + + +## complex + +- d ( delete __ ) + - w, j, k, h, l, e, $, ^, d, g, G, 0 +- ( ) + - w, e, h, j, k, l + +### how it will work +Digits get added to a buffer +Once an alpha char gets entered the buffer gets converted to an int and stored +if the alpha char is a d it gets stored as the action, pending a movement key for direction +if the alpha char is a movement key then the int, action (if present) and movement combine to +create a loop. +