ajout du control + R pour la recherche dans l'historique (j'ai prit pour exemple bash), et du \ en cas de \ en fin de ligne
This commit is contained in:
parent
3dd298b9c4
commit
bd33e1c9f2
6 changed files with 140 additions and 9 deletions
|
|
@ -6,7 +6,7 @@
|
||||||
/* By: gwojda <gwojda@student.42.fr> +#+ +:+ +#+ */
|
/* By: gwojda <gwojda@student.42.fr> +#+ +:+ +#+ */
|
||||||
/* +#+#+#+#+#+ +#+ */
|
/* +#+#+#+#+#+ +#+ */
|
||||||
/* Created: 2017/01/23 10:35:44 by gwojda #+# #+# */
|
/* Created: 2017/01/23 10:35:44 by gwojda #+# #+# */
|
||||||
/* Updated: 2017/01/25 20:04:33 by gwojda ### ########.fr */
|
/* Updated: 2017/01/26 13:36:59 by gwojda ### ########.fr */
|
||||||
/* */
|
/* */
|
||||||
/* ************************************************************************** */
|
/* ************************************************************************** */
|
||||||
|
|
||||||
|
|
@ -36,6 +36,7 @@
|
||||||
# define TOUCHE_DELETE 2117294875
|
# define TOUCHE_DELETE 2117294875
|
||||||
# define TOUCHE_CTRL_C 3
|
# define TOUCHE_CTRL_C 3
|
||||||
# define TOUCHE_CTRL_D 4
|
# define TOUCHE_CTRL_D 4
|
||||||
|
# define TOUCHE_CTRL_R 18
|
||||||
# define TOUCHE_HOME 4741915
|
# define TOUCHE_HOME 4741915
|
||||||
# define TOUCHE_END 4610843
|
# define TOUCHE_END 4610843
|
||||||
# define TOUCHE_TAB 9
|
# define TOUCHE_TAB 9
|
||||||
|
|
@ -51,6 +52,8 @@
|
||||||
|
|
||||||
# define HIST 1
|
# define HIST 1
|
||||||
|
|
||||||
|
# define ERROR_CNTL_R 1
|
||||||
|
|
||||||
typedef struct s_list_history
|
typedef struct s_list_history
|
||||||
{
|
{
|
||||||
char *str;
|
char *str;
|
||||||
|
|
@ -68,6 +71,9 @@ typedef struct s_line
|
||||||
t_list_history *list_beg;
|
t_list_history *list_beg;
|
||||||
} t_line;
|
} t_line;
|
||||||
|
|
||||||
|
void ft_check_backslash(char **str);
|
||||||
|
char *ft_strget_history(char *str);
|
||||||
|
void ft_surch_in_history(char **str, size_t *pos);
|
||||||
void ft_realloc_str_history_3(char **str, size_t pos, char *s);
|
void ft_realloc_str_history_3(char **str, size_t pos, char *s);
|
||||||
void ft_move_right(size_t *pos, char *str);
|
void ft_move_right(size_t *pos, char *str);
|
||||||
void ft_move_left(size_t *pos, char *str);
|
void ft_move_left(size_t *pos, char *str);
|
||||||
|
|
|
||||||
35
42sh/src/line-editing/check_backslash.c
Normal file
35
42sh/src/line-editing/check_backslash.c
Normal file
|
|
@ -0,0 +1,35 @@
|
||||||
|
/* ************************************************************************** */
|
||||||
|
/* */
|
||||||
|
/* ::: :::::::: */
|
||||||
|
/* check_backslash.c :+: :+: :+: */
|
||||||
|
/* +:+ +:+ +:+ */
|
||||||
|
/* By: gwojda <gwojda@student.42.fr> +#+ +:+ +#+ */
|
||||||
|
/* +#+#+#+#+#+ +#+ */
|
||||||
|
/* Created: 2017/01/26 13:32:52 by gwojda #+# #+# */
|
||||||
|
/* Updated: 2017/01/26 13:50:00 by gwojda ### ########.fr */
|
||||||
|
/* */
|
||||||
|
/* ************************************************************************** */
|
||||||
|
|
||||||
|
#include "minishell.h"
|
||||||
|
|
||||||
|
void ft_check_backslash(char **str)
|
||||||
|
{
|
||||||
|
char *tmp1;
|
||||||
|
char *tmp2;
|
||||||
|
|
||||||
|
if (!*str)
|
||||||
|
return ;
|
||||||
|
if ((*str)[ft_strlen(*str) - 1] == '\\')
|
||||||
|
{
|
||||||
|
ft_putstr("> ");
|
||||||
|
data_singleton()->line.prompt_size = 2;
|
||||||
|
tmp1 = *str;
|
||||||
|
tmp2 = ft_strjoin(tmp1, "\n");
|
||||||
|
free(tmp1);
|
||||||
|
tmp1 = ft_lecture(data_singleton()->line.list_beg);
|
||||||
|
*str = ft_strjoin(tmp2, tmp1);
|
||||||
|
free(tmp1);
|
||||||
|
free(tmp2);
|
||||||
|
ft_putchar('\n');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -6,7 +6,7 @@
|
||||||
/* By: gwojda <gwojda@student.42.fr> +#+ +:+ +#+ */
|
/* By: gwojda <gwojda@student.42.fr> +#+ +:+ +#+ */
|
||||||
/* +#+#+#+#+#+ +#+ */
|
/* +#+#+#+#+#+ +#+ */
|
||||||
/* Created: 2016/12/19 16:28:49 by gwojda #+# #+# */
|
/* Created: 2016/12/19 16:28:49 by gwojda #+# #+# */
|
||||||
/* Updated: 2017/01/25 16:26:30 by gwojda ### ########.fr */
|
/* Updated: 2017/01/26 11:36:19 by gwojda ### ########.fr */
|
||||||
/* */
|
/* */
|
||||||
/* ************************************************************************** */
|
/* ************************************************************************** */
|
||||||
|
|
||||||
|
|
@ -73,6 +73,11 @@ char *ft_lecture(t_list_history *head)
|
||||||
read(0, &ret, sizeof(int));
|
read(0, &ret, sizeof(int));
|
||||||
if (ret == TOUCHE_F6 && read(0, &ret, sizeof(int)) > 0)
|
if (ret == TOUCHE_F6 && read(0, &ret, sizeof(int)) > 0)
|
||||||
continue ;
|
continue ;
|
||||||
|
if (ret == TOUCHE_CTRL_R)
|
||||||
|
{
|
||||||
|
ft_surch_in_history(&str, &i);
|
||||||
|
continue ;
|
||||||
|
}
|
||||||
/*
|
/*
|
||||||
** if (ret == TOUCHE_TAB)
|
** if (ret == TOUCHE_TAB)
|
||||||
** ret = ft_completion(&str, &i);
|
** ret = ft_completion(&str, &i);
|
||||||
|
|
|
||||||
|
|
@ -6,13 +6,13 @@
|
||||||
/* By: gwojda <gwojda@student.42.fr> +#+ +:+ +#+ */
|
/* By: gwojda <gwojda@student.42.fr> +#+ +:+ +#+ */
|
||||||
/* +#+#+#+#+#+ +#+ */
|
/* +#+#+#+#+#+ +#+ */
|
||||||
/* Created: 2017/01/25 20:04:16 by gwojda #+# #+# */
|
/* Created: 2017/01/25 20:04:16 by gwojda #+# #+# */
|
||||||
/* Updated: 2017/01/25 20:06:09 by gwojda ### ########.fr */
|
/* Updated: 2017/01/26 11:33:22 by gwojda ### ########.fr */
|
||||||
/* */
|
/* */
|
||||||
/* ************************************************************************** */
|
/* ************************************************************************** */
|
||||||
|
|
||||||
#include "minishell.h"
|
#include "minishell.h"
|
||||||
|
|
||||||
static char *ft_strget_history(char *str)
|
char *ft_strget_history(char *str)
|
||||||
{
|
{
|
||||||
t_list_history *list;
|
t_list_history *list;
|
||||||
size_t i;
|
size_t i;
|
||||||
|
|
|
||||||
|
|
@ -6,7 +6,7 @@
|
||||||
/* By: gwojda <gwojda@student.42.fr> +#+ +:+ +#+ */
|
/* By: gwojda <gwojda@student.42.fr> +#+ +:+ +#+ */
|
||||||
/* +#+#+#+#+#+ +#+ */
|
/* +#+#+#+#+#+ +#+ */
|
||||||
/* Created: 2016/12/15 14:19:48 by gwojda #+# #+# */
|
/* Created: 2016/12/15 14:19:48 by gwojda #+# #+# */
|
||||||
/* Updated: 2017/01/25 17:06:53 by gwojda ### ########.fr */
|
/* Updated: 2017/01/26 13:38:29 by gwojda ### ########.fr */
|
||||||
/* */
|
/* */
|
||||||
/* ************************************************************************** */
|
/* ************************************************************************** */
|
||||||
|
|
||||||
|
|
@ -72,13 +72,15 @@ int ft_readline(void)
|
||||||
data_singleton()->line.input = NULL;
|
data_singleton()->line.input = NULL;
|
||||||
ft_prompt();
|
ft_prompt();
|
||||||
data_singleton()->line.input = ft_lecture(data_singleton()->line.list_beg);
|
data_singleton()->line.input = ft_lecture(data_singleton()->line.list_beg);
|
||||||
ft_putstr("\n");
|
ft_putchar('\n');
|
||||||
ft_check_quotes(&data_singleton()->line.input, data_singleton()->line.list_beg);
|
ft_check_quotes(&data_singleton()->line.input,
|
||||||
|
data_singleton()->line.list_beg);
|
||||||
ft_check_heredoc(&data_singleton()->line.input);
|
ft_check_heredoc(&data_singleton()->line.input);
|
||||||
ft_history_builtin();
|
ft_check_backslash(&data_singleton()->line.input);
|
||||||
ft_history_parsing();
|
ft_history_parsing();
|
||||||
if (data_singleton()->line.input)
|
if (data_singleton()->line.input)
|
||||||
ft_push_back_history(&data_singleton()->line.list_beg, ft_create_history_list(data_singleton()->line.input));
|
ft_push_back_history(&data_singleton()->line.list_beg,
|
||||||
|
ft_create_history_list(data_singleton()->line.input));
|
||||||
if (tcsetattr(0, TCSANOW, ft_save_stats_term()) == -1)
|
if (tcsetattr(0, TCSANOW, ft_save_stats_term()) == -1)
|
||||||
return (-1);
|
return (-1);
|
||||||
return (0);
|
return (0);
|
||||||
|
|
|
||||||
83
42sh/src/line-editing/surch_in_history.c
Normal file
83
42sh/src/line-editing/surch_in_history.c
Normal file
|
|
@ -0,0 +1,83 @@
|
||||||
|
/* ************************************************************************** */
|
||||||
|
/* */
|
||||||
|
/* ::: :::::::: */
|
||||||
|
/* surch_in_history.c :+: :+: :+: */
|
||||||
|
/* +:+ +:+ +:+ */
|
||||||
|
/* By: gwojda <gwojda@student.42.fr> +#+ +:+ +#+ */
|
||||||
|
/* +#+#+#+#+#+ +#+ */
|
||||||
|
/* Created: 2017/01/26 10:43:16 by gwojda #+# #+# */
|
||||||
|
/* Updated: 2017/01/26 14:01:53 by gwojda ### ########.fr */
|
||||||
|
/* */
|
||||||
|
/* ************************************************************************** */
|
||||||
|
|
||||||
|
#include "minishell.h"
|
||||||
|
|
||||||
|
void ft_clear_prompt(char *str, size_t *pos, size_t srch_pos)
|
||||||
|
{
|
||||||
|
if (str)
|
||||||
|
ft_get_beggin_with_curs(str, pos);
|
||||||
|
else if (*pos)
|
||||||
|
{
|
||||||
|
ft_putnc('\b', *pos);
|
||||||
|
(*pos) = 0;
|
||||||
|
}
|
||||||
|
ft_putnc('\b', data_singleton()->line.prompt_size + srch_pos + 1);
|
||||||
|
ft_puttermcaps("cd");
|
||||||
|
}
|
||||||
|
|
||||||
|
void ft_surch_and_realloc(char **str, char **str_srch, int ret, size_t *srch_pos)
|
||||||
|
{
|
||||||
|
*str_srch = ft_realloc_imput(*str_srch, ret, *srch_pos);
|
||||||
|
++(*srch_pos);
|
||||||
|
*str = ft_strget_history(*str_srch);
|
||||||
|
}
|
||||||
|
|
||||||
|
void ft_surch_in_history(char **str, size_t *pos)
|
||||||
|
{
|
||||||
|
char *str_srch;
|
||||||
|
int ret;
|
||||||
|
size_t srch_pos;
|
||||||
|
|
||||||
|
srch_pos = 0;
|
||||||
|
str_srch = NULL;
|
||||||
|
if (*str)
|
||||||
|
ft_strdel(str);
|
||||||
|
while (42)
|
||||||
|
{
|
||||||
|
ft_clear_prompt(*str, pos, srch_pos);
|
||||||
|
data_singleton()->line.prompt_size = 21;
|
||||||
|
if (str_srch)
|
||||||
|
ft_printf("\033[35m(reverse-i-search)`\033[32m%s\033[35m': \033[37m", str_srch);
|
||||||
|
else
|
||||||
|
ft_putstr("\033[35m(reverse-i-search)`': \033[37m");
|
||||||
|
if (*str)
|
||||||
|
{
|
||||||
|
ft_current_str(*str, *pos);
|
||||||
|
ft_get_next_str(*str, pos);
|
||||||
|
}
|
||||||
|
ret = 0;
|
||||||
|
read(0, &ret, sizeof(int));
|
||||||
|
if (ft_isprint(ret))
|
||||||
|
ft_surch_and_realloc(str, &str_srch, ret, &srch_pos);
|
||||||
|
else if (ret == 127)
|
||||||
|
{
|
||||||
|
if (srch_pos)
|
||||||
|
{
|
||||||
|
--srch_pos;
|
||||||
|
str_srch = ft_remove_imput(str_srch, srch_pos);
|
||||||
|
ft_puttermcaps("le");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
break ;
|
||||||
|
}
|
||||||
|
ft_clear_prompt(*str, pos, srch_pos);
|
||||||
|
ft_prompt();
|
||||||
|
if (*str)
|
||||||
|
{
|
||||||
|
*str = ft_strdup(*str);
|
||||||
|
ft_current_str(*str, *pos);
|
||||||
|
ft_get_next_str(*str, pos);
|
||||||
|
}
|
||||||
|
free(str_srch);
|
||||||
|
}
|
||||||
Loading…
Reference in a new issue