diff --git a/lib/uuid-console/src/shell.cpp b/lib/uuid-console/src/shell.cpp index 3090aaf8c..598d2d171 100644 --- a/lib/uuid-console/src/shell.cpp +++ b/lib/uuid-console/src/shell.cpp @@ -61,10 +61,12 @@ void Shell::start() { uuid::log::Logger::register_handler(this, uuid::log::Level::DEBUG); // added by proddy //uuid::log::Logger::register_handler(this, uuid::log::Level::INFO); // added by proddy #else - uuid::log::Logger::register_handler(this, uuid::log::Level::NOTICE); + uuid::log::Logger::register_handler(this, uuid::log::Level::INFO); #endif line_buffer_.reserve(maximum_command_line_length_); + oldline_.reserve(maximum_command_line_length_); + oldline_.clear(); display_banner(); display_prompt(); shells_.insert(shared_from_this()); @@ -175,6 +177,9 @@ void Shell::loop_normal() { case '\x0A': // Line feed (^J) if (previous_ != '\x0D') { + if (!line_buffer_.empty()) { + oldline_ = line_buffer_; + } process_command(); } break; @@ -187,6 +192,9 @@ void Shell::loop_normal() { break; case '\x0D': + if (!line_buffer_.empty()) { + oldline_ = line_buffer_; + } // Carriage return (^M) process_command(); break; @@ -211,6 +219,20 @@ void Shell::loop_normal() { line_buffer_.push_back(c); write((uint8_t)c); } + // cursor up, get last command + if ((c == 'A') && (previous_ == '[')) { + erase_current_line(); + prompt_displayed_ = false; + line_buffer_ = oldline_; + display_prompt(); + } + // cursor back, forw or down: Delete line + if (((c == 'B') || (c == 'C') || (c == 'D')) && (previous_ == '[')) { + erase_current_line(); + prompt_displayed_ = false; + line_buffer_.clear(); + display_prompt(); + } } break; } diff --git a/lib/uuid-console/src/uuid/console.h b/lib/uuid-console/src/uuid/console.h index 423e85ae8..9062dc09b 100644 --- a/lib/uuid-console/src/uuid/console.h +++ b/lib/uuid-console/src/uuid/console.h @@ -905,6 +905,7 @@ class Shell : public std::enable_shared_from_this, public uuid::log::Hand std::string line_buffer_; /*!< Command line buffer. Limited to maximum_command_line_length() bytes. @since 0.1.0 */ size_t maximum_command_line_length_ = MAX_COMMAND_LINE_LENGTH; /*!< Maximum command line length in bytes. @since 0.6.0 */ unsigned char previous_ = 0; /*!< Previous character that was entered on the command line. Used to detect CRLF line endings. @since 0.1.0 */ + std::string oldline_; /*!< old Command line buffer.*/ Mode mode_ = Mode::NORMAL; /*!< Current execution mode. @since 0.1.0 */ std::unique_ptr mode_data_ = nullptr; /*!< Data associated with the current execution mode. @since 0.1.0 */ bool stopped_ = false; /*!< Indicates that the shell has been stopped. @since 0.1.0 */