Skip to content

Commit 5e7a9ea

Browse files
committed
suggestion: added display
1 parent 7adffd5 commit 5e7a9ea

File tree

6 files changed

+44
-19
lines changed

6 files changed

+44
-19
lines changed

src/completion/base.rs

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,8 @@ pub trait Completer: Send {
7878
pub struct Suggestion {
7979
/// String replacement that will be introduced to the the buffer
8080
pub value: String,
81+
/// Optional display value for the replacement
82+
pub display: Option<String>,
8183
/// Optional description for the replacement
8284
pub description: Option<String>,
8385
/// Optional style for the replacement
@@ -91,3 +93,10 @@ pub struct Suggestion {
9193
/// This helps to avoid that a completer repeats the complete suggestion.
9294
pub append_whitespace: bool,
9395
}
96+
97+
impl Suggestion {
98+
/// Returns display if set, otherwise value.
99+
pub fn display_or_value(&self) -> &String {
100+
self.display.as_ref().unwrap_or(&self.value)
101+
}
102+
}

src/completion/default.rs

Lines changed: 16 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -55,17 +55,17 @@ impl Completer for DefaultCompleter {
5555
/// assert_eq!(
5656
/// completions.complete("bat",3),
5757
/// vec![
58-
/// Suggestion {value: "batcave".into(), description: None, style: None, extra: None, span: Span { start: 0, end: 3 }, append_whitespace: false},
59-
/// Suggestion {value: "batman".into(), description: None, style: None, extra: None, span: Span { start: 0, end: 3 }, append_whitespace: false},
60-
/// Suggestion {value: "batmobile".into(), description: None, style: None, extra: None, span: Span { start: 0, end: 3 }, append_whitespace: false},
58+
/// Suggestion {value: "batcave".into(), display: None, description: None, style: None, extra: None, span: Span { start: 0, end: 3 }, append_whitespace: false},
59+
/// Suggestion {value: "batman".into(), display: None, description: None, style: None, extra: None, span: Span { start: 0, end: 3 }, append_whitespace: false},
60+
/// Suggestion {value: "batmobile".into(), display: None, description: None, style: None, extra: None, span: Span { start: 0, end: 3 }, append_whitespace: false},
6161
/// ]);
6262
///
6363
/// assert_eq!(
6464
/// completions.complete("to the bat",10),
6565
/// vec![
66-
/// Suggestion {value: "batcave".into(), description: None, style: None, extra: None, span: Span { start: 7, end: 10 }, append_whitespace: false},
67-
/// Suggestion {value: "batman".into(), description: None, style: None, extra: None, span: Span { start: 7, end: 10 }, append_whitespace: false},
68-
/// Suggestion {value: "batmobile".into(), description: None, style: None, extra: None, span: Span { start: 7, end: 10 }, append_whitespace: false},
66+
/// Suggestion {value: "batcave".into(), display: None, description: None, style: None, extra: None, span: Span { start: 7, end: 10 }, append_whitespace: false},
67+
/// Suggestion {value: "batman".into(), display: None, description: None, style: None, extra: None, span: Span { start: 7, end: 10 }, append_whitespace: false},
68+
/// Suggestion {value: "batmobile".into(), display: None, description: None, style: None, extra: None, span: Span { start: 7, end: 10 }, append_whitespace: false},
6969
/// ]);
7070
/// ```
7171
fn complete(&mut self, line: &str, pos: usize) -> Vec<Suggestion> {
@@ -101,6 +101,7 @@ impl Completer for DefaultCompleter {
101101

102102
Suggestion {
103103
value: format!("{span_line}{ext}"),
104+
display: None,
104105
description: None,
105106
style: None,
106107
extra: None,
@@ -177,15 +178,15 @@ impl DefaultCompleter {
177178
/// completions.insert(vec!["test-hyphen","test_underscore"].iter().map(|s| s.to_string()).collect());
178179
/// assert_eq!(
179180
/// completions.complete("te",2),
180-
/// vec![Suggestion {value: "test".into(), description: None, style: None, extra: None, span: Span { start: 0, end: 2 }, append_whitespace: false}]);
181+
/// vec![Suggestion {value: "test".into(), display: None, description: None, style: None, extra: None, span: Span { start: 0, end: 2 }, append_whitespace: false}]);
181182
///
182183
/// let mut completions = DefaultCompleter::with_inclusions(&['-', '_']);
183184
/// completions.insert(vec!["test-hyphen","test_underscore"].iter().map(|s| s.to_string()).collect());
184185
/// assert_eq!(
185186
/// completions.complete("te",2),
186187
/// vec![
187-
/// Suggestion {value: "test-hyphen".into(), description: None, style: None, extra: None, span: Span { start: 0, end: 2 }, append_whitespace: false},
188-
/// Suggestion {value: "test_underscore".into(), description: None, style: None, extra: None, span: Span { start: 0, end: 2 }, append_whitespace: false},
188+
/// Suggestion {value: "test-hyphen".into(), display: None, description: None, style: None, extra: None, span: Span { start: 0, end: 2 }, append_whitespace: false},
189+
/// Suggestion {value: "test_underscore".into(), display: None, description: None, style: None, extra: None, span: Span { start: 0, end: 2 }, append_whitespace: false},
189190
/// ]);
190191
/// ```
191192
pub fn with_inclusions(incl: &[char]) -> Self {
@@ -374,6 +375,7 @@ mod tests {
374375
[
375376
Suggestion {
376377
value: "null".into(),
378+
display: None,
377379
description: None,
378380
style: None,
379381
extra: None,
@@ -382,6 +384,7 @@ mod tests {
382384
},
383385
Suggestion {
384386
value: "number".into(),
387+
display: None,
385388
description: None,
386389
style: None,
387390
extra: None,
@@ -390,6 +393,7 @@ mod tests {
390393
},
391394
Suggestion {
392395
value: "nushell".into(),
396+
display: None,
393397
description: None,
394398
style: None,
395399
extra: None,
@@ -418,6 +422,7 @@ mod tests {
418422
[
419423
Suggestion {
420424
value: "test".into(),
425+
display: None,
421426
description: None,
422427
style: None,
423428
extra: None,
@@ -426,6 +431,7 @@ mod tests {
426431
},
427432
Suggestion {
428433
value: "this is the reedline crate".into(),
434+
display: None,
429435
description: None,
430436
style: None,
431437
extra: None,
@@ -434,6 +440,7 @@ mod tests {
434440
},
435441
Suggestion {
436442
value: "this is the reedline crate".into(),
443+
display: None,
437444
description: None,
438445
style: None,
439446
extra: None,

src/completion/history.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,7 @@ impl<'menu> HistoryCompleter<'menu> {
5858

5959
Suggestion {
6060
value: value.to_string(),
61+
display: None,
6162
description: None,
6263
style: None,
6364
extra: None,

src/menu/columnar_menu.rs

Lines changed: 15 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -351,7 +351,7 @@ impl ColumnarMenu {
351351
.reverse()
352352
.prefix(),
353353
self.color.selected_text_style.prefix(),
354-
&suggestion.value,
354+
suggestion.display_or_value(),
355355
RESET,
356356
self.color.description_style.reverse().prefix(),
357357
self.color.selected_text_style.prefix(),
@@ -373,7 +373,7 @@ impl ColumnarMenu {
373373
.reverse()
374374
.prefix(),
375375
self.color.selected_text_style.prefix(),
376-
&suggestion.value,
376+
suggestion.display_or_value(),
377377
RESET,
378378
"",
379379
self.end_of_line(column),
@@ -386,7 +386,7 @@ impl ColumnarMenu {
386386
format!(
387387
"{}{:max$}{}{}{}{}{}",
388388
suggestion.style.unwrap_or(self.color.text_style).prefix(),
389-
&suggestion.value,
389+
suggestion.display_or_value(),
390390
RESET,
391391
self.color.description_style.prefix(),
392392
description
@@ -402,7 +402,7 @@ impl ColumnarMenu {
402402
format!(
403403
"{}{}{}{}{:>empty$}{}{}",
404404
suggestion.style.unwrap_or(self.color.text_style).prefix(),
405-
&suggestion.value,
405+
suggestion.display_or_value(),
406406
RESET,
407407
self.color.description_style.prefix(),
408408
"",
@@ -419,7 +419,7 @@ impl ColumnarMenu {
419419
format!(
420420
"{}{:max$}{}{}",
421421
marker,
422-
&suggestion.value,
422+
suggestion.display_or_value(),
423423
description
424424
.chars()
425425
.take(empty_space)
@@ -436,7 +436,7 @@ impl ColumnarMenu {
436436
format!(
437437
"{}{}{:>empty$}{}",
438438
marker,
439-
&suggestion.value,
439+
suggestion.display_or_value(),
440440
"",
441441
self.end_of_line(column),
442442
empty = empty_space.saturating_sub(marker.len()),
@@ -590,15 +590,17 @@ impl Menu for ColumnarMenu {
590590
self.working_details.col_width = painter.screen_width() as usize;
591591

592592
self.longest_suggestion = self.get_values().iter().fold(0, |prev, suggestion| {
593-
if prev >= suggestion.value.len() {
593+
let suggestion_length = suggestion.display_or_value().len();
594+
if prev >= suggestion_length {
594595
prev
595596
} else {
596-
suggestion.value.len()
597+
suggestion_length
597598
}
598599
});
599600
} else {
600601
let max_width = self.get_values().iter().fold(0, |acc, suggestion| {
601-
let str_len = suggestion.value.len() + self.default_details.col_padding;
602+
let str_len =
603+
suggestion.display_or_value().len() + self.default_details.col_padding;
602604
if str_len > acc {
603605
str_len
604606
} else {
@@ -734,7 +736,9 @@ impl Menu for ColumnarMenu {
734736
// Correcting the enumerate index based on the number of skipped values
735737
let index = index + skip_values;
736738
let column = index as u16 % self.get_cols();
737-
let empty_space = self.get_width().saturating_sub(suggestion.value.len());
739+
let empty_space = self
740+
.get_width()
741+
.saturating_sub(suggestion.display_or_value().len());
738742

739743
self.create_string(suggestion, index, column, empty_space, use_ansi_coloring)
740744
})
@@ -825,6 +829,7 @@ mod tests {
825829
fn fake_suggestion(name: &str, pos: usize) -> Suggestion {
826830
Suggestion {
827831
value: name.to_string(),
832+
display: None,
828833
description: None,
829834
style: None,
830835
extra: None,

src/menu/ide_menu.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1472,6 +1472,7 @@ mod tests {
14721472
fn fake_suggestion(name: &str, pos: usize) -> Suggestion {
14731473
Suggestion {
14741474
value: name.to_string(),
1475+
display: None,
14751476
description: None,
14761477
style: None,
14771478
extra: None,

src/menu/menu_functions.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -496,6 +496,7 @@ mod tests {
496496
.into_iter()
497497
.map(|s| Suggestion {
498498
value: s.into(),
499+
display: None,
499500
description: None,
500501
style: None,
501502
extra: None,
@@ -516,6 +517,7 @@ mod tests {
516517
.into_iter()
517518
.map(|s| Suggestion {
518519
value: s.into(),
520+
display: None,
519521
description: None,
520522
style: None,
521523
extra: None,

0 commit comments

Comments
 (0)