scrolling and whatnot
This commit is contained in:
parent
bfacf003ad
commit
e9c16239bb
|
@ -20,7 +20,7 @@ clean:
|
||||||
.PHONY: run
|
.PHONY: run
|
||||||
run: $(BIN)
|
run: $(BIN)
|
||||||
reset
|
reset
|
||||||
./$(BIN) escapes.txt
|
./$(BIN) notes.txt
|
||||||
|
|
||||||
%.o: %.c
|
%.o: %.c
|
||||||
$(CC) $(CFLAGS) -c $@ $<
|
$(CC) $(CFLAGS) -c $@ $<
|
||||||
|
|
12
ke/keys.txt
12
ke/keys.txt
|
@ -6,19 +6,19 @@ ESC: 1b
|
||||||
Function keys: 1b followed by
|
Function keys: 1b followed by
|
||||||
|
|
||||||
F1 F2 F3 F4 F5 F6 F7 F8
|
F1 F2 F3 F4 F5 F6 F7 F8
|
||||||
4f O 4f O 4f O 4f O 5b 5b 5b 5b
|
4f O 4F O 4F O 4F O 5B 5B 5B 5B
|
||||||
50 P 51 Q 52 R 54 S 31 1 31 1 31 1 31 1
|
50 P 51 Q 52 R 54 S 31 1 31 1 31 1 31 1
|
||||||
35 5 37 7 38 8 39 9
|
35 5 37 7 38 8 39 9
|
||||||
7e ~ 7e ~ 7e ~ 7e ~
|
7E ~ 7E ~ 7E ~ 7E ~
|
||||||
|
|
||||||
F9 F10 F11 F12
|
F9 F10 F11 F12
|
||||||
5b [ 5b [ 5b [ 5b [
|
5B [ 5B [ 5B [ 5B [
|
||||||
32 2 32 2 32 2 32 2
|
32 2 32 2 32 2 32 2
|
||||||
30 0 31 1 33 3 34 4
|
30 0 31 1 33 3 34 4
|
||||||
7e ~ 7e ~ 7e ~ 7e ~
|
7E ~ 7E ~ 7E ~ 7E ~
|
||||||
|
|
||||||
DEL 7f - but it should be a 4-byte escape sequence?
|
DEL 7F - BUT IT SHOULD BE A 4-BYTE ESCAPE SEQUENCE?
|
||||||
BKSP 7f
|
BKSP 7F
|
||||||
|
|
||||||
Arrow keys: 1b followed by
|
Arrow keys: 1b followed by
|
||||||
UP DN LF RT
|
UP DN LF RT
|
||||||
|
|
134
ke/main.c
134
ke/main.c
|
@ -1,3 +1,9 @@
|
||||||
|
/*
|
||||||
|
* kyle's editor
|
||||||
|
*
|
||||||
|
* first version is a run-through of the kilo editor walkthrough.
|
||||||
|
* https://viewsourcecode.org/snaptoken/kilo/
|
||||||
|
*/
|
||||||
#include <sys/ioctl.h>
|
#include <sys/ioctl.h>
|
||||||
#include <ctype.h>
|
#include <ctype.h>
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
|
@ -39,7 +45,10 @@ void disable_termraw();
|
||||||
|
|
||||||
typedef struct erow {
|
typedef struct erow {
|
||||||
char *line;
|
char *line;
|
||||||
|
char *render;
|
||||||
|
|
||||||
int size;
|
int size;
|
||||||
|
int rsize;
|
||||||
} erow;
|
} erow;
|
||||||
|
|
||||||
struct {
|
struct {
|
||||||
|
@ -48,6 +57,7 @@ struct {
|
||||||
int curx, cury;
|
int curx, cury;
|
||||||
int mode;
|
int mode;
|
||||||
int nrows;
|
int nrows;
|
||||||
|
int rowoffs, coloffs;
|
||||||
erow *row;
|
erow *row;
|
||||||
} editor;
|
} editor;
|
||||||
|
|
||||||
|
@ -131,6 +141,10 @@ append_row(char *s, size_t len)
|
||||||
editor.row[at].line = malloc(len+1);
|
editor.row[at].line = malloc(len+1);
|
||||||
memcpy(editor.row[at].line, s, len);
|
memcpy(editor.row[at].line, s, len);
|
||||||
editor.row[at].line[len] = '\0';
|
editor.row[at].line[len] = '\0';
|
||||||
|
|
||||||
|
editor.row[at].rsize = 0;
|
||||||
|
editor.row[at].render = NULL;
|
||||||
|
|
||||||
editor.nrows++;
|
editor.nrows++;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -241,65 +255,47 @@ get_keypress()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static inline void
|
|
||||||
ymov(int dy)
|
|
||||||
{
|
|
||||||
editor.cury += dy;
|
|
||||||
if (editor.cury < 0) {
|
|
||||||
editor.cury = 0;
|
|
||||||
} else if (editor.cury > editor.rows) {
|
|
||||||
/*
|
|
||||||
* NOTE(kyle): this should be restrited to buffer lines,
|
|
||||||
* but we don't have a buffer yet.
|
|
||||||
*/
|
|
||||||
editor.cury = editor.rows;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static inline void
|
|
||||||
xmov(int dx)
|
|
||||||
{
|
|
||||||
editor.curx += dx;
|
|
||||||
if (editor.curx < 0) {
|
|
||||||
editor.curx = 0;
|
|
||||||
ymov(-1);
|
|
||||||
} else if (editor.curx > editor.cols) {
|
|
||||||
if (editor.cury == editor.rows) {
|
|
||||||
editor.curx = editor.cols;
|
|
||||||
} else {
|
|
||||||
editor.curx = 0;
|
|
||||||
}
|
|
||||||
ymov(1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void
|
void
|
||||||
move_cursor(int16_t c)
|
move_cursor(int16_t c)
|
||||||
{
|
{
|
||||||
int reps;
|
erow *row = (editor.cury >= editor.nrows) ?
|
||||||
|
NULL : &editor.row[editor.cury];
|
||||||
|
int reps;
|
||||||
|
|
||||||
switch (c) {
|
switch (c) {
|
||||||
case ARROW_UP:
|
case ARROW_UP:
|
||||||
case CTRL_KEY('p'):
|
case CTRL_KEY('p'):
|
||||||
ymov(-1);
|
if (editor.cury > 0) {
|
||||||
|
editor.cury--;
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
case ARROW_DOWN:
|
case ARROW_DOWN:
|
||||||
case CTRL_KEY('n'):
|
case CTRL_KEY('n'):
|
||||||
ymov(1);
|
if (editor.cury < editor.nrows) {
|
||||||
|
editor.cury++;
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
case ARROW_RIGHT:
|
case ARROW_RIGHT:
|
||||||
case CTRL_KEY('f'):
|
case CTRL_KEY('f'):
|
||||||
xmov(1);
|
if (row && editor.curx < row->size) {
|
||||||
|
editor.curx++;
|
||||||
|
} else if (row && editor.curx == row->size) {
|
||||||
|
editor.cury++;
|
||||||
|
editor.curx = 0;
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
case ARROW_LEFT:
|
case ARROW_LEFT:
|
||||||
case CTRL_KEY('b'):
|
case CTRL_KEY('b'):
|
||||||
xmov(-1);
|
if (editor.curx > 0) {
|
||||||
|
editor.curx--;
|
||||||
|
} else if (editor.cury > 0) {
|
||||||
|
editor.cury--;
|
||||||
|
editor.curx = editor.row[editor.cury].size;
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
case PG_UP:
|
case PG_UP:
|
||||||
case PG_DN: {
|
case PG_DN: {
|
||||||
reps = editor.rows;
|
reps = editor.rows+1;
|
||||||
while (--reps) {
|
while (--reps) {
|
||||||
move_cursor(c == PG_UP ? ARROW_UP : ARROW_DOWN);
|
move_cursor(c == PG_UP ? ARROW_UP : ARROW_DOWN);
|
||||||
}
|
}
|
||||||
|
@ -314,6 +310,14 @@ move_cursor(int16_t c)
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
row = (editor.cury >= editor.nrows) ?
|
||||||
|
NULL : &editor.row[editor.cury];
|
||||||
|
reps = row ? row->size : 0;
|
||||||
|
if (editor.curx > reps) {
|
||||||
|
editor.curx = reps;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -444,11 +448,12 @@ void
|
||||||
draw_rows(struct abuf *ab)
|
draw_rows(struct abuf *ab)
|
||||||
{
|
{
|
||||||
char buf[editor.cols];
|
char buf[editor.cols];
|
||||||
int buflen, padding;
|
int buflen, filerow, padding;
|
||||||
int y;
|
int y;
|
||||||
|
|
||||||
for (y = 0; y < editor.rows; y++) {
|
for (y = 0; y < editor.rows; y++) {
|
||||||
if (y >= editor.nrows) {
|
filerow = y + editor.rowoffs;
|
||||||
|
if (filerow >= editor.nrows) {
|
||||||
if ((editor.nrows == 0) && (y == editor.rows / 3)) {
|
if ((editor.nrows == 0) && (y == editor.rows / 3)) {
|
||||||
buflen = snprintf(buf, sizeof(buf),
|
buflen = snprintf(buf, sizeof(buf),
|
||||||
"ke k%s", KE_VERSION);
|
"ke k%s", KE_VERSION);
|
||||||
|
@ -465,11 +470,16 @@ draw_rows(struct abuf *ab)
|
||||||
ab_append(ab, "|", 1);
|
ab_append(ab, "|", 1);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
buflen = editor.row[y].size;
|
buflen = editor.row[filerow].size - editor.coloffs;
|
||||||
if (buflen > editor.rows) {
|
if (buflen < 0) {
|
||||||
buflen = editor.rows;
|
buflen = 0;
|
||||||
}
|
}
|
||||||
ab_append(ab, editor.row[y].line, buflen);
|
|
||||||
|
if (buflen > editor.cols) {
|
||||||
|
buflen = editor.cols;
|
||||||
|
}
|
||||||
|
ab_append(ab, editor.row[filerow].line+editor.coloffs,
|
||||||
|
buflen);
|
||||||
}
|
}
|
||||||
ab_append(ab, ESCSEQ "K", 3);
|
ab_append(ab, ESCSEQ "K", 3);
|
||||||
if (y < (editor.rows - 1)) {
|
if (y < (editor.rows - 1)) {
|
||||||
|
@ -479,19 +489,43 @@ draw_rows(struct abuf *ab)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
scroll()
|
||||||
|
{
|
||||||
|
if (editor.cury < editor.rowoffs) {
|
||||||
|
editor.rowoffs = editor.cury;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (editor.cury >= editor.rowoffs + editor.rows) {
|
||||||
|
editor.rowoffs = editor.cury - editor.rows + 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (editor.curx < editor.coloffs) {
|
||||||
|
editor.coloffs = editor.curx;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (editor.curx >= editor.coloffs + editor.cols) {
|
||||||
|
editor.coloffs = editor.curx - editor.cols + 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void
|
void
|
||||||
display_refresh()
|
display_refresh()
|
||||||
{
|
{
|
||||||
char buf[32];
|
char buf[32];
|
||||||
struct abuf ab = ABUF_INIT;
|
struct abuf ab = ABUF_INIT;
|
||||||
|
|
||||||
|
scroll();
|
||||||
|
|
||||||
ab_append(&ab, ESCSEQ "?25l", 6);
|
ab_append(&ab, ESCSEQ "?25l", 6);
|
||||||
display_clear(&ab);
|
display_clear(&ab);
|
||||||
|
|
||||||
draw_rows(&ab);
|
draw_rows(&ab);
|
||||||
|
|
||||||
snprintf(buf, sizeof(buf), ESCSEQ "%d;%dH", editor.cury+1,
|
snprintf(buf, sizeof(buf), ESCSEQ "%d;%dH",
|
||||||
editor.curx+1);
|
(editor.cury-editor.rowoffs)+1,
|
||||||
|
(editor.curx-editor.coloffs)+1);
|
||||||
ab_append(&ab, buf, strnlen(buf, 32));
|
ab_append(&ab, buf, strnlen(buf, 32));
|
||||||
/* ab_append(&ab, ESCSEQ "1;2H", 7); */
|
/* ab_append(&ab, ESCSEQ "1;2H", 7); */
|
||||||
ab_append(&ab, ESCSEQ "?25h", 6);
|
ab_append(&ab, ESCSEQ "?25h", 6);
|
||||||
|
@ -521,10 +555,10 @@ init_editor()
|
||||||
die("can't get window size");
|
die("can't get window size");
|
||||||
}
|
}
|
||||||
|
|
||||||
editor.curx = 0;
|
editor.curx = editor.cury = 0;
|
||||||
editor.cury = 0;
|
|
||||||
|
|
||||||
editor.nrows = 0;
|
editor.nrows = 0;
|
||||||
|
editor.rowoffs = editor.coloffs = 0;
|
||||||
editor.row = NULL;
|
editor.row = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -85,3 +85,7 @@ enable_termraw()
|
||||||
die("tcsetattr while enabling raw mode");
|
die("tcsetattr while enabling raw mode");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
So this is a really long line; it should overflow the buffer and it's helpful for doing things like testing horizontal scrolling. Furthermore, it's at least twice as long as the line is likely to be, so there's more opportunity to test whether scrolling works correctly.
|
||||||
|
|
||||||
|
But this line is nominal.
|
||||||
|
|
Loading…
Reference in New Issue