diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/nvim/rbuffer.c | 9 | ||||
| -rw-r--r-- | src/nvim/tui/term_input.inl | 5 | 
2 files changed, 14 insertions, 0 deletions
diff --git a/src/nvim/rbuffer.c b/src/nvim/rbuffer.c index 9cf681585b..0a04ba1954 100644 --- a/src/nvim/rbuffer.c +++ b/src/nvim/rbuffer.c @@ -69,6 +69,15 @@ char *rbuffer_write_ptr(RBuffer *buf, size_t *write_count) FUNC_ATTR_NONNULL_ALL    return buf->write_ptr;  } +// Set read and write pointer for an empty RBuffer to the beginning of the +// buffer. +void rbuffer_reset(RBuffer *buf) FUNC_ATTR_NONNULL_ALL +{ +  if (buf->size == 0) { +    buf->write_ptr = buf->read_ptr = buf->start_ptr; +  } +} +  /// Adjust `rbuffer` write pointer to reflect produced data. This is called  /// automatically by `rbuffer_write`, but when using `rbuffer_write_ptr`  /// directly, this needs to called after the data was copied to the internal diff --git a/src/nvim/tui/term_input.inl b/src/nvim/tui/term_input.inl index 451ac195f2..efdcf0a41e 100644 --- a/src/nvim/tui/term_input.inl +++ b/src/nvim/tui/term_input.inl @@ -243,6 +243,7 @@ static void read_cb(RStream *rstream, RBuffer *buf, void *data, bool eof)      RBUFFER_EACH(input->read_buffer, c, i) {        count = i + 1;        if (c == '\x1b' && count > 1) { +        count--;          break;        }      } @@ -262,6 +263,10 @@ static void read_cb(RStream *rstream, RBuffer *buf, void *data, bool eof)        }      }    } while (rbuffer_size(input->read_buffer)); + +  // Make sure the next input escape sequence fits into the ring buffer +  // without wrap around, otherwise it could be misinterpreted. +  rbuffer_reset(input->read_buffer);  }  static TermInput *term_input_new(void)  | 
