diff --git a/include/key_functions.h b/include/key_functions.h index c994760..a7f9fcb 100644 --- a/include/key_functions.h +++ b/include/key_functions.h @@ -26,6 +26,10 @@ typedef struct binding extern const key_function_t key_functions[]; extern const binding_t emacs_bindings[]; +int buffer_get_display_pos(buffer_t *buffer); + + int self_insert_command(int key, buffer_t *buffer, env_t *env); int newline_command(int key, buffer_t *buffer, env_t *env); -int eof_command(int key, buffer_t *buffer, env_t *env); \ No newline at end of file +int eof_command(int key, buffer_t *buffer, env_t *env); +int backward_delete_char_command(int key, buffer_t *buffer, env_t *env); \ No newline at end of file diff --git a/src/key_bindings/basic_typing_functions.c b/src/key_bindings/basic_typing_functions.c index 2387150..5b175eb 100644 --- a/src/key_bindings/basic_typing_functions.c +++ b/src/key_bindings/basic_typing_functions.c @@ -34,6 +34,18 @@ int self_insert_command(int key, buffer_t *buffer, env_t *env) return (0); } +int backward_delete_char_command(int key, buffer_t *buffer, env_t *env) +{ + int len = buffer->buffer ? strlen(buffer->buffer) : 0; + + if (buffer->pos == 0) + return (0); + buffer->pos--; + for (int i = buffer->pos; i < len; i++) + buffer->buffer[i] = buffer->buffer[i + 1]; + return (0); +} + int newline_command(int key, buffer_t *buffer, env_t *env) { int ret; diff --git a/src/key_bindings/default_bindings.c b/src/key_bindings/default_bindings.c index 3b90897..4e8eb05 100644 --- a/src/key_bindings/default_bindings.c +++ b/src/key_bindings/default_bindings.c @@ -14,11 +14,14 @@ const key_function_t key_functions[] = { {"self-insert-command", &self_insert_command}, {"newline", &newline_command}, {"enf-of-file", &eof_command}, + {"backward-delete-char", &backward_delete_char_command}, {NULL, NULL} }; const binding_t emacs_bindings[] = { {'\n', &newline_command}, {CTRL('d'), &eof_command}, + {127, &backward_delete_char_command}, + {KEY_BACKSPACE, &backward_delete_char_command}, {0, NULL} }; \ No newline at end of file diff --git a/src/shell.c b/src/shell.c index b30943f..a8079e4 100644 --- a/src/shell.c +++ b/src/shell.c @@ -73,6 +73,7 @@ void start_shell(env_t *env) refresh(); y = getcury(env->window); mvaddstr(y, buffer.startx, buffer.buffer); + clrtoeol(); move(y, buffer_get_display_pos(&buffer)); key = getch(); } else