diff --git a/add-interactive.c b/add-interactive.c index 041e990aae..f0beeefa79 100644 --- a/add-interactive.c +++ b/add-interactive.c @@ -66,6 +66,10 @@ int init_add_i_state(struct repository *r, struct add_i_state *s) &s->interactive_diff_algorithm)) s->interactive_diff_algorithm = NULL; + if (git_config_get_bool("interactive.singlekey", + &s->use_single_key)) + s->use_single_key = 0; + return 0; } diff --git a/add-interactive.h b/add-interactive.h index 25e300b4a0..41b9b2fa38 100644 --- a/add-interactive.h +++ b/add-interactive.h @@ -16,6 +16,7 @@ struct add_i_state { char file_old_color[COLOR_MAXLEN]; char file_new_color[COLOR_MAXLEN]; + int use_single_key; char *interactive_diff_filter, *interactive_diff_algorithm; }; @@ -31,6 +32,7 @@ enum color_add_i { const char *get_add_i_color(enum color_add_i ix); const char *get_interactive_diff_filter(void); const char *get_interactive_diff_algorithm(void); +int get_interactive_use_single_key(void); struct repository; struct pathspec; diff --git a/add-patch.c b/add-patch.c index ecef863f85..e8e7cfa48d 100644 --- a/add-patch.c +++ b/add-patch.c @@ -6,6 +6,7 @@ #include "pathspec.h" #include "color.h" #include "diff.h" +#include "compat/terminal.h" enum prompt_mode_type { PROMPT_MODE_CHANGE = 0, PROMPT_DELETION, PROMPT_HUNK @@ -1047,14 +1048,27 @@ static int run_apply_check(struct add_p_state *s, return 0; } +static int read_single_character(struct add_p_state *s) +{ + if (s->s.use_single_key) { + int res = read_key_without_echo(&s->answer); + printf("%s\n", res == EOF ? "" : s->answer.buf); + return res; + } + + if (strbuf_getline(&s->answer, stdin) == EOF) + return EOF; + strbuf_trim_trailing_newline(&s->answer); + return 0; +} + static int prompt_yesno(struct add_p_state *s, const char *prompt) { for (;;) { color_fprintf(stdout, s->s.prompt_color, "%s", _(prompt)); fflush(stdout); - if (strbuf_getline(&s->answer, stdin) == EOF) + if (read_single_character(s) == EOF) return -1; - strbuf_trim_trailing_newline(&s->answer); switch (tolower(s->answer.buf[0])) { case 'n': return 0; case 'y': return 1; @@ -1290,9 +1304,8 @@ static int patch_update_file(struct add_p_state *s, _(s->mode->prompt_mode[prompt_mode_type]), s->buf.buf); fflush(stdout); - if (strbuf_getline(&s->answer, stdin) == EOF) + if (read_single_character(s) == EOF) break; - strbuf_trim_trailing_newline(&s->answer); if (!s->answer.len) continue;