diff options
Diffstat (limited to 'unix')
-rw-r--r-- | unix/main.c | 58 | ||||
-rw-r--r-- | unix/mpconfigport.h | 1 |
2 files changed, 59 insertions, 0 deletions
diff --git a/unix/main.c b/unix/main.c index aede75353b..651c3836cc 100644 --- a/unix/main.c +++ b/unix/main.c @@ -134,6 +134,9 @@ STATIC int execute_from_lexer(mp_lexer_t *lex, mp_parse_input_kind_t input_kind, } } +#if MICROPY_USE_READLINE == 1 +#include "lib/mp-readline/readline.h" +#else STATIC char *strjoin(const char *s1, int sep_char, const char *s2) { int l1 = strlen(s1); int l2 = strlen(s2); @@ -147,10 +150,63 @@ STATIC char *strjoin(const char *s1, int sep_char, const char *s2) { s[l1 + l2] = 0; return s; } +#endif STATIC int do_repl(void) { mp_hal_stdout_tx_str("Micro Python " MICROPY_GIT_TAG " on " MICROPY_BUILD_DATE "; " MICROPY_PY_SYS_PLATFORM " version\n"); + #if MICROPY_USE_READLINE == 1 + + // use MicroPython supplied readline + + vstr_t line; + vstr_init(&line, 16); + for (;;) { + input_restart: + vstr_reset(&line); + mp_hal_stdio_mode_raw(); + int ret = readline(&line, ">>> "); + + if (ret == CHAR_CTRL_D) { + // EOF + printf("\n"); + mp_hal_stdio_mode_orig(); + vstr_clear(&line); + return 0; + } else if (line.len == 0) { + if (ret != 0) { + printf("\n"); + } + mp_hal_stdio_mode_orig(); + continue; + } + + while (mp_repl_continue_with_input(vstr_null_terminated_str(&line))) { + vstr_add_byte(&line, '\n'); + ret = readline(&line, "... "); + if (ret == CHAR_CTRL_C) { + // cancel everything + printf("\n"); + mp_hal_stdio_mode_orig(); + goto input_restart; + } else if (ret == CHAR_CTRL_D) { + // stop entering compound statement + break; + } + } + mp_hal_stdio_mode_orig(); + + mp_lexer_t *lex = mp_lexer_new_from_str_len(MP_QSTR__lt_stdin_gt_, line.buf, line.len, false); + ret = execute_from_lexer(lex, MP_PARSE_SINGLE_INPUT, true); + if (ret & FORCED_EXIT) { + return ret; + } + } + + #else + + // use GNU or simple readline + for (;;) { char *line = prompt(">>> "); if (line == NULL) { @@ -175,6 +231,8 @@ STATIC int do_repl(void) { } free(line); } + + #endif } STATIC int do_file(const char *file) { diff --git a/unix/mpconfigport.h b/unix/mpconfigport.h index d503aea975..f51d1aeae0 100644 --- a/unix/mpconfigport.h +++ b/unix/mpconfigport.h @@ -53,6 +53,7 @@ #define MICROPY_USE_READLINE_HISTORY (1) #define MICROPY_HELPER_REPL (1) #define MICROPY_REPL_EMACS_KEYS (1) +#define MICROPY_REPL_AUTO_INDENT (1) #define MICROPY_HELPER_LEXER_UNIX (1) #define MICROPY_ENABLE_SOURCE_LINE (1) #define MICROPY_FLOAT_IMPL (MICROPY_FLOAT_IMPL_DOUBLE) |