mirror of
https://github.com/zoriya/ash.git
synced 2026-06-02 18:50:43 +00:00
Handling up/down arrow keys for history
This commit is contained in:
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
@@ -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
@@ -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);
|
||||
}
|
||||
Reference in New Issue
Block a user