more updates

This commit is contained in:
Kyle Isom 2020-02-12 17:11:32 -08:00
parent c584777662
commit 3f9a95287a
3 changed files with 68 additions and 10 deletions

View File

@ -29,4 +29,8 @@ keypress: keypress.c
install: $(BIN) install: $(BIN)
install -C $(BIN) $(HOME)/bin/ install -C $(BIN) $(HOME)/bin/
.PHONY: cloc
cloc:
cloc main.c defs.h abuf.c erow.c
%.o: %.c %.o: %.c

View File

@ -129,7 +129,6 @@ erow_insert(int at, char *s, int len)
assert(editor->row != NULL); assert(editor->row != NULL);
if (at < editor->nrows) { if (at < editor->nrows) {
printf("%d, %d\n", at, editor->nrows);
memmove(&editor->row[at+1], &editor->row[at], memmove(&editor->row[at+1], &editor->row[at],
sizeof(struct erow) * (editor->nrows - at + 1)); sizeof(struct erow) * (editor->nrows - at + 1));
} }

View File

@ -1,7 +1,10 @@
/* /*
* kyle's editor * kyle's editor
* *
* first version is a run-through of the kilo editor walkthrough. * first version is a run-through of the kilo editor walkthrough as a
* set of guiderails. I've made a lot of changes and did some things
* differently. keep an eye for for kte, kyle's text editor - the rewrite
*
* https://viewsourcecode.org/snaptoken/kilo/ * https://viewsourcecode.org/snaptoken/kilo/
*/ */
#include <sys/ioctl.h> #include <sys/ioctl.h>
@ -34,7 +37,7 @@
*/ */
#define MODE_NORMAL 0 #define MODE_NORMAL 0
#define MODE_KCOMMAND 1 #define MODE_KCOMMAND 1
#define MODE_INSERT 2 #define MODE_ESCAPE 2
void editor_set_status(const char *fmt, ...); void editor_set_status(const char *fmt, ...);
@ -160,12 +163,13 @@ row_insert_ch(struct erow *row, int at, int16_t c)
if ((at < 0) || (at > row->size)) { if ((at < 0) || (at > row->size)) {
at = row->size; at = row->size;
} }
assert(c > 0);
row->line = realloc(row->line, row->size+2); row->line = realloc(row->line, row->size+2);
assert(row->line != NULL); assert(row->line != NULL);
memmove(&row->line[at+1], &row->line[at], row->size - at + 1); memmove(&row->line[at+1], &row->line[at], row->size - at + 1);
row->size++; row->size++;
row->line[at] = c; row->line[at] = c & 0xff;
erow_update(row); erow_update(row);
} }
@ -216,7 +220,6 @@ deletech()
} }
row = &editor->row[editor->cury]; row = &editor->row[editor->cury];
if (editor->curx > 0) { if (editor->curx > 0) {
row_delete_ch(row, editor->curx - 1); row_delete_ch(row, editor->curx - 1);
editor->curx--; editor->curx--;
@ -541,6 +544,9 @@ editor_find_callback(char *query, int16_t c)
editor->cury = current; editor->cury = current;
editor->curx = erow_render_to_cursor(row, editor->curx = erow_render_to_cursor(row,
match - row->render); match - row->render);
if (editor->curx > row->size) {
editor->curx = row->size;
}
/* /*
* after this, scroll will put the match line at * after this, scroll will put the match line at
* the top of the screen. * the top of the screen.
@ -756,6 +762,7 @@ process_kcommand(int16_t c)
return; return;
} }
void void
process_normal(int16_t c) process_normal(int16_t c)
{ {
@ -782,10 +789,10 @@ process_normal(int16_t c)
deletech(); deletech();
break; break;
case CTRL_KEY('l'): case CTRL_KEY('l'):
/* ignore refresh for now */ display_refresh();
break; break;
case ESC_KEY: case ESC_KEY:
/* TODO(kyle) */ editor->mode = MODE_ESCAPE;
break; break;
default: default:
if (isprint(c) || c == TAB_KEY) { if (isprint(c) || c == TAB_KEY) {
@ -798,6 +805,21 @@ process_normal(int16_t c)
} }
void
process_escape(int16_t c)
{
switch (c) {
case '>':
editor->cury = editor->nrows;
editor->curx = 0;
break;
case '<':
editor->cury = 0;
editor->curx = 0;
}
}
int int
process_keypress() process_keypress()
{ {
@ -817,6 +839,12 @@ process_keypress()
case MODE_NORMAL: case MODE_NORMAL:
process_normal(c); process_normal(c);
break; break;
case MODE_ESCAPE:
process_escape(c);
break;
default:
editor_set_status("we're in the %d-D space now cap'n", editor->mode);
editor->mode = MODE_NORMAL;
} }
return 1; return 1;
@ -946,6 +974,22 @@ draw_rows(struct abuf *ab)
} }
static char
status_mode_char()
{
switch (editor->mode) {
case MODE_NORMAL:
return 'N';
case MODE_KCOMMAND:
return 'K';
case MODE_ESCAPE:
return 'E';
default:
return '?';
}
}
void void
draw_status_bar(struct abuf *ab) draw_status_bar(struct abuf *ab)
{ {
@ -954,7 +998,7 @@ draw_status_bar(struct abuf *ab)
int len, rlen; int len, rlen;
len = snprintf(status, sizeof(status), "%c%cke: %.20s - %d lines", len = snprintf(status, sizeof(status), "%c%cke: %.20s - %d lines",
editor->mode == MODE_KCOMMAND ? 'K' : 'N', status_mode_char(),
editor->dirty ? '!' : '-', editor->dirty ? '!' : '-',
editor->filename ? editor->filename : "[no file]", editor->filename ? editor->filename : "[no file]",
editor->nrows); editor->nrows);
@ -1063,9 +1107,20 @@ editor_set_status(const char *fmt, ...)
void void
loop() loop()
{ {
int up = 1; /* update on the first runthrough */
while (1) { while (1) {
display_refresh(); if (up) display_refresh();
while (process_keypress() != 0) ;
/*
* ke should only refresh the display if it has received keyboard
* input; if it has, drain all the inputs. This is useful for
* handling pastes without massive screen flicker.
*
*/
if ((up = process_keypress()) != 0) {
while (process_keypress()) ;
}
} }
} }