Update reedline to improved undo-system (#6326)

* Update after Reedline API update

* Remove references to deleted `ReedlineEvent::ActionHandler`
* Update `DescriptionMenu` implementation for the new `Menu` trait
  API changes that work on `Editor` rather than `LineBuffer` objects

* Update reedline

Includes nushell/reedline#460

Co-authored-by: Ben Parks <bnprks+git@gmail.com>
This commit is contained in:
Stefan Holderbach 2022-08-15 00:35:37 +02:00 committed by GitHub
parent 21770367e2
commit a4809f2e68
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 31 additions and 29 deletions

2
Cargo.lock generated
View File

@ -3924,7 +3924,7 @@ dependencies = [
[[package]] [[package]]
name = "reedline" name = "reedline"
version = "0.9.0" version = "0.9.0"
source = "git+https://github.com/nushell/reedline.git?branch=main#a406bfc6621f01805a0a80cd520ac59c128aec23" source = "git+https://github.com/nushell/reedline.git?branch=main#174255535dccb0fea5e2d0e055fc5884830df898"
dependencies = [ dependencies = [
"chrono", "chrono",
"crossterm 0.24.0", "crossterm 0.24.0",

View File

@ -1,8 +1,8 @@
use { use {
nu_ansi_term::{ansi::RESET, Style}, nu_ansi_term::{ansi::RESET, Style},
reedline::{ reedline::{
menu_functions::string_difference, Completer, LineBuffer, Menu, MenuEvent, MenuTextStyle, menu_functions::string_difference, Completer, Editor, Menu, MenuEvent, MenuTextStyle,
Painter, Suggestion, Painter, Suggestion, UndoBehavior,
}, },
}; };
@ -459,7 +459,7 @@ impl Menu for DescriptionMenu {
fn can_partially_complete( fn can_partially_complete(
&mut self, &mut self,
_values_updated: bool, _values_updated: bool,
_line_buffer: &mut LineBuffer, _editor: &mut Editor,
_completer: &mut dyn Completer, _completer: &mut dyn Completer,
) -> bool { ) -> bool {
false false
@ -481,19 +481,21 @@ impl Menu for DescriptionMenu {
} }
/// Updates menu values /// Updates menu values
fn update_values(&mut self, line_buffer: &mut LineBuffer, completer: &mut dyn Completer) { fn update_values(&mut self, editor: &mut Editor, completer: &mut dyn Completer) {
if self.only_buffer_difference { if self.only_buffer_difference {
if let Some(old_string) = &self.input { if let Some(old_string) = &self.input {
let (start, input) = string_difference(line_buffer.get_buffer(), old_string); let (start, input) = string_difference(editor.get_buffer(), old_string);
if !input.is_empty() { if !input.is_empty() {
self.reset_position(); self.reset_position();
self.values = completer.complete(input, start); self.values = completer.complete(input, start);
} }
} }
} else { } else {
let trimmed_buffer = line_buffer.get_buffer().replace('\n', " "); let trimmed_buffer = editor.get_buffer().replace('\n', " ");
self.values = self.values = completer.complete(
completer.complete(trimmed_buffer.as_str(), line_buffer.insertion_point()); trimmed_buffer.as_str(),
editor.line_buffer().insertion_point(),
);
self.reset_position(); self.reset_position();
} }
} }
@ -502,7 +504,7 @@ impl Menu for DescriptionMenu {
/// collected from the completer /// collected from the completer
fn update_working_details( fn update_working_details(
&mut self, &mut self,
line_buffer: &mut LineBuffer, editor: &mut Editor,
completer: &mut dyn Completer, completer: &mut dyn Completer,
painter: &Painter, painter: &Painter,
) { ) {
@ -560,13 +562,13 @@ impl Menu for DescriptionMenu {
match event { match event {
MenuEvent::Activate(_) => { MenuEvent::Activate(_) => {
self.reset_position(); self.reset_position();
self.input = Some(line_buffer.get_buffer().to_string()); self.input = Some(editor.get_buffer().to_string());
self.update_values(line_buffer, completer); self.update_values(editor, completer);
} }
MenuEvent::Deactivate => self.active = false, MenuEvent::Deactivate => self.active = false,
MenuEvent::Edit(_) => { MenuEvent::Edit(_) => {
self.reset_position(); self.reset_position();
self.update_values(line_buffer, completer); self.update_values(editor, completer);
self.update_examples() self.update_examples()
} }
MenuEvent::NextElement => { MenuEvent::NextElement => {
@ -627,27 +629,28 @@ impl Menu for DescriptionMenu {
} }
/// The buffer gets replaced in the Span location /// The buffer gets replaced in the Span location
fn replace_in_buffer(&self, line_buffer: &mut LineBuffer) { fn replace_in_buffer(&self, editor: &mut Editor) {
if let Some(Suggestion { value, span, .. }) = self.get_value() { if let Some(Suggestion { value, span, .. }) = self.get_value() {
let start = span.start.min(line_buffer.len()); let start = span.start.min(editor.line_buffer().len());
let end = span.end.min(line_buffer.len()); let end = span.end.min(editor.line_buffer().len());
let string_len = if let Some(example_index) = self.example_index { let replacement = if let Some(example_index) = self.example_index {
let example = self self.examples
.examples
.get(example_index) .get(example_index)
.expect("the example index is always checked"); .expect("the example index is always checked")
line_buffer.replace(start..end, example);
example.len()
} else { } else {
line_buffer.replace(start..end, &value); &value
value.len()
}; };
let mut offset = line_buffer.insertion_point(); editor.edit_buffer(
offset += string_len.saturating_sub(end.saturating_sub(start)); |lb| {
line_buffer.set_insertion_point(offset); lb.replace_range(start..end, replacement);
let mut offset = lb.insertion_point();
offset += lb.len().saturating_sub(end.saturating_sub(start));
lb.set_insertion_point(offset);
},
UndoBehavior::CreateUndoPoint,
);
} }
} }

View File

@ -814,7 +814,6 @@ fn event_from_record(
) -> Result<ReedlineEvent, ShellError> { ) -> Result<ReedlineEvent, ShellError> {
let event = match name { let event = match name {
"none" => ReedlineEvent::None, "none" => ReedlineEvent::None,
"actionhandler" => ReedlineEvent::ActionHandler,
"clearscreen" => ReedlineEvent::ClearScreen, "clearscreen" => ReedlineEvent::ClearScreen,
"clearscrollback" => ReedlineEvent::ClearScrollback, "clearscrollback" => ReedlineEvent::ClearScrollback,
"historyhintcomplete" => ReedlineEvent::HistoryHintComplete, "historyhintcomplete" => ReedlineEvent::HistoryHintComplete,