Even more sophisticated readline functionality

This commit is contained in:
2021-11-04 14:00:35 -04:00
parent deaf4e4873
commit e5a1f238ec
4 changed files with 17 additions and 22 deletions

View File

@@ -23,7 +23,16 @@ Channel::~Channel() {
driven_->channels_[chid_] = nullptr;
}
void Channel::show_command() {
void Channel::show_or_hide_command() {
// Decide if we should hide the command, and if so, do it.
if ((!readline_enabled_) || (driven_->stop_driver_) || (sb_out_->fill() > 0)) {
int ccsize = current_prompt_.size() + current_command_.size();
readline_echo_ += util::repeat_string("\b \b", ccsize);
current_prompt_ = "";
current_command_ = "";
return;
}
// If the prompt has changed, erase everything and start over.
if (desired_prompt_ != current_prompt_) {
int ccsize = current_prompt_.size() + current_command_.size();
@@ -51,18 +60,9 @@ void Channel::show_command() {
}
}
void Channel::hide_command() {
int ccsize = current_command_.size() + current_prompt_.size();
if (ccsize > 0) {
readline_echo_ += util::repeat_string("\b \b", ccsize);
current_command_ = "";
current_prompt_ = "";
}
}
void Channel::set_prompt(const std::string &p) {
desired_prompt_ = p;
if (readline_enabled_) show_command();
show_or_hide_command();
}
void Channel::feed_readline(int nbytes, const char *bytes) {
@@ -72,7 +72,7 @@ void Channel::feed_readline(int nbytes, const char *bytes) {
// Ignore newline immediately after carriage return.
// Otherwise, crlf produces two newlines.
} else if ((c == '\r') || (c == '\n')) {
show_command();
show_or_hide_command();
readline_echo_ = readline_echo_ + " \n";
sb_in_->write_bytes(desired_command_);
sb_in_->write_uint8('\n');
@@ -95,11 +95,7 @@ void Channel::feed_readline(int nbytes, const char *bytes) {
}
void Channel::peek_outgoing(int *nbytes, const char **bytes) {
if (sb_out_->fill() > 0) {
hide_command();
} else if (readline_enabled_) {
show_command();
}
show_or_hide_command();
if (readline_echo_.size() > 0) {
*nbytes = readline_echo_.size();
*bytes = readline_echo_.c_str();
@@ -127,6 +123,7 @@ void Channel::set_readline(bool e) {
if (e != readline_enabled_) {
readline_enabled_ = e;
desired_command_ = "";
show_or_hide_command();
}
}