From 0f5f3cbe97d7ba87835cb7c794075410256cd218 Mon Sep 17 00:00:00 2001
From: Anonymus Raccoon
Date: Thu, 7 May 2020 17:41:39 +0200
Subject: [PATCH] Supporting the backspace
---
include/key_functions.h | 6 +++++-
src/key_bindings/basic_typing_functions.c | 12 ++++++++++++
src/key_bindings/default_bindings.c | 3 +++
src/shell.c | 1 +
4 files changed, 21 insertions(+), 1 deletion(-)
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