From b46975e99ce2af84234f32513bed8637f32a4d2e Mon Sep 17 00:00:00 2001 From: gwenn Date: Tue, 3 Aug 2021 19:46:42 +0200 Subject: [PATCH 1/3] Fix complete hint Run Hinter again after hint is completed --- src/lib.rs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index 0d85b1b0e..e189e776f 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -265,8 +265,7 @@ fn complete_hint_line(s: &mut State<'_, '_, H>) -> Result<()> { } else { s.out.beep()?; } - s.refresh_line_with_msg(None)?; - Ok(()) + s.refresh_line() } fn page_completions( From 6e5a7c6e8d22fd2661fb49be2ee35a120f35c937 Mon Sep 17 00:00:00 2001 From: gwenn Date: Tue, 3 Aug 2021 19:50:38 +0200 Subject: [PATCH 2/3] Ignore empty hint --- src/edit.rs | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/edit.rs b/src/edit.rs index 703171210..5e4718828 100644 --- a/src/edit.rs +++ b/src/edit.rs @@ -174,9 +174,12 @@ impl<'out, 'prompt, H: Helper> State<'out, 'prompt, H> { pub fn hint(&mut self) { if let Some(hinter) = self.helper { let hint = hinter.hint(self.line.as_str(), self.line.pos(), &self.ctx); - self.hint = hint.map(|val| Box::new(val) as Box) + self.hint = match hint { + Some(val) if !val.display().is_empty() => Some(Box::new(val) as Box), + _ => None, + }; } else { - self.hint = None + self.hint = None; } } From dbf7fd03f4ce66436c7b74bb559efb5295a47e31 Mon Sep 17 00:00:00 2001 From: gwenn Date: Tue, 3 Aug 2021 20:01:00 +0200 Subject: [PATCH 3/3] Fix Hinter implementations --- examples/diy_hints.rs | 4 ++-- src/hint.rs | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/examples/diy_hints.rs b/examples/diy_hints.rs index 26f58d8c2..70296b0a8 100644 --- a/examples/diy_hints.rs +++ b/examples/diy_hints.rs @@ -52,7 +52,7 @@ impl Hinter for DIYHinter { type Hint = CommandHint; fn hint(&self, line: &str, pos: usize, _ctx: &Context<'_>) -> Option { - if pos < line.len() { + if line.is_empty() || pos < line.len() { return None; } @@ -61,7 +61,7 @@ impl Hinter for DIYHinter { .filter_map(|hint| { // expect hint after word complete, like redis cli, add condition: // line.ends_with(" ") - if pos > 0 && hint.display.starts_with(&line[..pos]) { + if hint.display.starts_with(line) { Some(hint.suffix(pos)) } else { None diff --git a/src/hint.rs b/src/hint.rs index 793e06c2a..71b162a23 100644 --- a/src/hint.rs +++ b/src/hint.rs @@ -56,7 +56,7 @@ impl Hinter for HistoryHinter { type Hint = String; fn hint(&self, line: &str, pos: usize, ctx: &Context<'_>) -> Option { - if pos < line.len() { + if line.is_empty() || pos < line.len() { return None; } let start = if ctx.history_index() == ctx.history().len() { @@ -66,9 +66,9 @@ impl Hinter for HistoryHinter { }; if let Some(sr) = ctx .history - .starts_with(&line[..pos], start, SearchDirection::Reverse) + .starts_with(line, start, SearchDirection::Reverse) { - if sr.entry == line || sr.entry == &line[..pos] { + if sr.entry == line { return None; } return Some(sr.entry[pos..].to_owned());