Handling up/down arrow keys for history

This commit is contained in:
Anonymus Raccoon
2020-05-21 17:25:34 +02:00
parent 478cb53d24
commit ad878d8c89
6 changed files with 59 additions and 1 deletions
+3
View File
@@ -38,3 +38,6 @@ 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);
int up_history_command(int key, buffer_t *buffer, env_t *env);
int down_history_command(int key, buffer_t *buffer, env_t *env);
+2
View File
@@ -31,6 +31,8 @@ typedef struct buffer
int size;
int pos;
int startx;
int history_index;
char *saved_buffer;
} buffer_t;
typedef struct alias_s
@@ -69,6 +69,7 @@ int newline_command(int key, buffer_t *buffer, env_t *env)
my_nresume(env->window);
buffer->buffer[0] = '\0';
buffer->pos = 0;
buffer->history_index = 0;
if (env->window)
my_getcuryx(&env->window->y, &env->window->x);
}
+46
View File
@@ -6,8 +6,54 @@
*/
#include "shell.h"
#include <stddef.h>
#include <string.h>
#include <malloc.h>
int eof_command(int key, buffer_t *buffer, env_t *env)
{
return (-1);
}
bool set_buffer_to_history(buffer_t *buffer, env_t *env)
{
history_t *hist = env->history;
char *cmd = NULL;
int len;
if (buffer->history_index == 0)
cmd = buffer->saved_buffer != NULL ? buffer->saved_buffer : "";
else
for (int i = 1; i < buffer->history_index && hist; i++)
hist = hist->next;
if (!cmd && (!hist || !(cmd = hist->command)))
return (false);
if (!buffer->buffer || buffer->size < (len = strlen(cmd))) {
buffer->buffer = realloc(buffer->buffer, buffer->size + len);
buffer->size += len;
}
if (!buffer->buffer)
return (false);
strcpy(buffer->buffer, cmd);
buffer->pos = strlen(buffer->buffer);
return (true);
}
int up_history_command(int key, buffer_t *buffer, env_t *env)
{
if (buffer->buffer && buffer->history_index == 0)
buffer->saved_buffer = strdup(buffer->buffer);
buffer->history_index++;
if (!set_buffer_to_history(buffer, env))
buffer->history_index--;
return (0);
}
int down_history_command(int key, buffer_t *buffer, env_t *env)
{
if (buffer->history_index <= 0)
return (0);
buffer->history_index--;
set_buffer_to_history(buffer, env);
return (0);
}
+2
View File
@@ -33,5 +33,7 @@ const binding_t emacs_bindings[] = {
{KEY_RIGHT, &forward_char_command},
{KEY_HOME, &beginning_of_line_command},
{KEY_END, &end_of_line_command},
{KEY_UP, &up_history_command},
{KEY_DOWN, &down_history_command},
{0, NULL}
};
+5 -1
View File
@@ -66,7 +66,7 @@ void shell_refresh(buffer_t *buffer, env_t *env)
void start_shell(env_t *env)
{
buffer_t buffer = {.size = 0, .buffer = NULL, .pos = 0, .startx = 0};
buffer_t buffer = {NULL, 0, 0, 0, 0, NULL};
int key;
if (isatty(0)) {
@@ -80,5 +80,9 @@ void start_shell(env_t *env)
} else
key = fgetc(stdin);
} while (key != -1 && process_key(key, &buffer, env) >= 0);
if (buffer.saved_buffer)
free(buffer.saved_buffer);
if (buffer.buffer)
free(buffer.buffer);
my_endwin(env->window);
}