update: history commands

This commit is contained in:
wang904 2022-08-18 10:29:35 +08:00
parent fc41973c70
commit aa64a3a375

View File

@ -9,7 +9,7 @@
#include "cmd.h"
#define pause_cpu() asm volatile("pause\n\t");
#define mem_history 1024
/**
* @brief
*
@ -21,9 +21,11 @@
int shell_readline(int fd, char *buf);
void print_ascii_logo();
extern char *shell_current_path;
//保存的历史命令
char history_commands[mem_history][256];
int count_history;
//现在对应的命令
int pointer;
/**
* @brief shell主循环
*
@ -31,7 +33,8 @@ extern char *shell_current_path;
*/
void main_loop(int kb_fd)
{
count_history = 0;
pointer = 1;
unsigned char input_buffer[INPUT_BUFFER_SIZE] = {0};
// 初始化当前工作目录的路径
@ -40,7 +43,6 @@ void main_loop(int kb_fd)
memset(shell_current_path, 0, 3);
shell_current_path[0] = '/';
shell_current_path[1] = '\0';
// shell命令行的主循环
while (true)
{
@ -56,10 +58,19 @@ void main_loop(int kb_fd)
if (count)
{
char *command_origin[strlen(input_buffer)];
strcpy(command_origin, input_buffer);
int cmd_num = parse_command(input_buffer, &argc, &argv);
printf("\n");
if (cmd_num >= 0)
{
//加入历史命令
strcpy(history_commands[count_history], command_origin);
count_history++;
pointer = count_history;
shell_run_built_in_command(cmd_num, argc, argv);
}
}
else
printf("\n");
@ -80,7 +91,37 @@ int main()
while (1)
;
}
/**
* @brief
*
* @param count
* @param buf
*/
void clear_command(int count, char *buf)
{
for (int i = 0; i < count; i++)
{
printf("%c", '\b');
}
memset(buf, 0, sizeof(buf));
}
/**
* @brief ()
*
* @param buf
* @param type 1,,-1,
*/
void change_command(char *buf, int type)
{
pointer -= type;
//处理边界
if (pointer >= count_history)
pointer--;
if (pointer < 0)
pointer++;
strcpy(buf, history_commands[pointer]);
printf("%s", buf);
}
/**
* @brief
*
@ -96,10 +137,28 @@ int shell_readline(int fd, char *buf)
while (1)
{
key = keyboard_analyze_keycode(fd);
//向上方向键
if (count_history != 0 && key == 0xc8)
{
clear_command(count, buf);
count = 0;
//向历史
change_command(buf, 1);
count = strlen(buf);
}
//向下方向键
if (count_history != 0 && key == 0x50)
{
clear_command(count, buf);
count = 0;
//向现在
change_command(buf, -1);
count = strlen(buf);
}
if (key == '\n')
return count;
if (key)
if (key && key != 0x50 && key != 0xc8)
{
if (key == '\b')
{