diff --git a/Makefile b/Makefile index ac8a6b2..0246e05 100644 --- a/Makefile +++ b/Makefile @@ -32,7 +32,8 @@ SRC = src/shell.c \ src/key_bindings/basic_typing_functions.c \ src/key_bindings/default_bindings.c \ src/key_bindings/control_commands.c \ - src/redirections/pty_pipe.c + src/redirections/pty_pipe.c \ + src/key_bindings/move_commands.c OBJ = $(SRC:%.c=%.o) OBJ += src/main.o diff --git a/include/key_functions.h b/include/key_functions.h index a7f9fcb..516b774 100644 --- a/include/key_functions.h +++ b/include/key_functions.h @@ -32,4 +32,11 @@ 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); -int backward_delete_char_command(int key, buffer_t *buffer, env_t *env); \ No newline at end of file + +int backward_delete_char_command(int key, buffer_t *buffer, env_t *env); +int delete_char_command(int key, buffer_t *buffer, env_t *env); + +int forward_char_command(int key, buffer_t *buffer, env_t *env); +int backward_char_command(int key, buffer_t *buffer, env_t *env); +int beginning_of_line_command(int key, buffer_t *buffer, env_t *env); +int end_of_line_command(int key, buffer_t *buffer, env_t *env); diff --git a/src/key_bindings/basic_typing_functions.c b/src/key_bindings/basic_typing_functions.c index 5b175eb..c55c8a3 100644 --- a/src/key_bindings/basic_typing_functions.c +++ b/src/key_bindings/basic_typing_functions.c @@ -46,6 +46,15 @@ int backward_delete_char_command(int key, buffer_t *buffer, env_t *env) return (0); } +int delete_char_command(int key, buffer_t *buffer, env_t *env) +{ + int len = buffer->buffer ? strlen(buffer->buffer) : 0; + + 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 4e8eb05..6c0463f 100644 --- a/src/key_bindings/default_bindings.c +++ b/src/key_bindings/default_bindings.c @@ -15,6 +15,11 @@ const key_function_t key_functions[] = { {"newline", &newline_command}, {"enf-of-file", &eof_command}, {"backward-delete-char", &backward_delete_char_command}, + {"delete-char", &delete_char_command}, + {"backward-char", &backward_char_command}, + {"forward-char", &forward_char_command}, + {"beginning-of-line", &beginning_of_line_command}, + {"end-of-line", &end_of_line_command}, {NULL, NULL} }; @@ -23,5 +28,10 @@ const binding_t emacs_bindings[] = { {CTRL('d'), &eof_command}, {127, &backward_delete_char_command}, {KEY_BACKSPACE, &backward_delete_char_command}, + {KEY_DC, &delete_char_command}, + {KEY_LEFT, &backward_char_command}, + {KEY_RIGHT, &forward_char_command}, + {KEY_HOME, &beginning_of_line_command}, + {KEY_END, &end_of_line_command}, {0, NULL} }; \ No newline at end of file diff --git a/src/key_bindings/move_commands.c b/src/key_bindings/move_commands.c new file mode 100644 index 0000000..7817e7b --- /dev/null +++ b/src/key_bindings/move_commands.c @@ -0,0 +1,35 @@ +/* +** EPITECH PROJECT, 2020 +** ash +** File description: +** arrow_commands +*/ + +#include "shell.h" +#include "key_functions.h" + +int backward_char_command(int key, buffer_t *buffer, env_t *env) +{ + if (buffer->pos != 0) + buffer->pos--; + return (0); +} + +int forward_char_command(int key, buffer_t *buffer, env_t *env) +{ + if (buffer->buffer && buffer->buffer[buffer->pos] != '\0') + buffer->pos++; + return (0); +} + +int beginning_of_line_command(int key, buffer_t *buffer, env_t *env) +{ + buffer->pos = 0; + return (0); +} + +int end_of_line_command(int key, buffer_t *buffer, env_t *env) +{ + buffer->pos = buffer->buffer ? strlen(buffer->buffer) : 0; + return (0); +} \ No newline at end of file