Skip to content

Commit 1f89ec3

Browse files
committed
luggestion: added display
1 parent ab1b47e commit 1f89ec3

File tree

6 files changed

+45
-16
lines changed

6 files changed

+45
-16
lines changed

src/completion/base.rs

+9
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

+16-9
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\r\nbat",11),
6565
/// vec![
66-
/// Suggestion {value: "batcave".into(), description: None, style: None, extra: None, span: Span { start: 8, end: 11 }, append_whitespace: false},
67-
/// Suggestion {value: "batman".into(), description: None, style: None, extra: None, span: Span { start: 8, end: 11 }, append_whitespace: false},
68-
/// Suggestion {value: "batmobile".into(), description: None, style: None, extra: None, span: Span { start: 8, end: 11 }, append_whitespace: false},
66+
/// Suggestion {value: "batcave".into(), display: None, description: None, style: None, extra: None, span: Span { start: 8, end: 11 }, append_whitespace: false},
67+
/// Suggestion {value: "batman".into(), display: None, description: None, style: None, extra: None, span: Span { start: 8, end: 11 }, append_whitespace: false},
68+
/// Suggestion {value: "batmobile".into(), display: None, description: None, style: None, extra: None, span: Span { start: 8, end: 11 }, append_whitespace: false},
6969
/// ]);
7070
/// ```
7171
fn complete(&mut self, line: &str, pos: usize) -> Vec<Suggestion> {
@@ -105,6 +105,7 @@ impl Completer for DefaultCompleter {
105105

106106
Suggestion {
107107
value: format!("{span_line}{ext}"),
108+
display: None,
108109
description: None,
109110
style: None,
110111
extra: None,
@@ -182,15 +183,15 @@ impl DefaultCompleter {
182183
/// completions.insert(vec!["test-hyphen","test_underscore"].iter().map(|s| s.to_string()).collect());
183184
/// assert_eq!(
184185
/// completions.complete("te",2),
185-
/// vec![Suggestion {value: "test".into(), description: None, style: None, extra: None, span: Span { start: 0, end: 2 }, append_whitespace: false}]);
186+
/// vec![Suggestion {value: "test".into(), display: None, description: None, style: None, extra: None, span: Span { start: 0, end: 2 }, append_whitespace: false}]);
186187
///
187188
/// let mut completions = DefaultCompleter::with_inclusions(&['-', '_']);
188189
/// completions.insert(vec!["test-hyphen","test_underscore"].iter().map(|s| s.to_string()).collect());
189190
/// assert_eq!(
190191
/// completions.complete("te",2),
191192
/// vec![
192-
/// Suggestion {value: "test-hyphen".into(), description: None, style: None, extra: None, span: Span { start: 0, end: 2 }, append_whitespace: false},
193-
/// Suggestion {value: "test_underscore".into(), description: None, style: None, extra: None, span: Span { start: 0, end: 2 }, append_whitespace: false},
193+
/// Suggestion {value: "test-hyphen".into(), display: None, description: None, style: None, extra: None, span: Span { start: 0, end: 2 }, append_whitespace: false},
194+
/// Suggestion {value: "test_underscore".into(), display: None, description: None, style: None, extra: None, span: Span { start: 0, end: 2 }, append_whitespace: false},
194195
/// ]);
195196
/// ```
196197
pub fn with_inclusions(incl: &[char]) -> Self {
@@ -379,6 +380,7 @@ mod tests {
379380
[
380381
Suggestion {
381382
value: "null".into(),
383+
display: None,
382384
description: None,
383385
style: None,
384386
extra: None,
@@ -387,6 +389,7 @@ mod tests {
387389
},
388390
Suggestion {
389391
value: "number".into(),
392+
display: None,
390393
description: None,
391394
style: None,
392395
extra: None,
@@ -395,6 +398,7 @@ mod tests {
395398
},
396399
Suggestion {
397400
value: "nushell".into(),
401+
display: None,
398402
description: None,
399403
style: None,
400404
extra: None,
@@ -423,6 +427,7 @@ mod tests {
423427
[
424428
Suggestion {
425429
value: "test".into(),
430+
display: None,
426431
description: None,
427432
style: None,
428433
extra: None,
@@ -431,6 +436,7 @@ mod tests {
431436
},
432437
Suggestion {
433438
value: "this is the reedline crate".into(),
439+
display: None,
434440
description: None,
435441
style: None,
436442
extra: None,
@@ -439,6 +445,7 @@ mod tests {
439445
},
440446
Suggestion {
441447
value: "this is the reedline crate".into(),
448+
display: None,
442449
description: None,
443450
style: None,
444451
extra: None,

src/completion/history.rs

+1
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,7 @@ impl<'menu> HistoryCompleter<'menu> {
6060

6161
Suggestion {
6262
value: value.to_string(),
63+
display: None,
6364
description: None,
6465
style: None,
6566
extra: None,

src/menu/columnar_menu.rs

+16-7
Original file line numberDiff line numberDiff line change
@@ -302,7 +302,11 @@ impl ColumnarMenu {
302302
let match_len = self.working_details.shortest_base_string.len();
303303

304304
// Split string so the match text can be styled
305-
let (match_str, remaining_str) = suggestion.value.split_at(match_len);
305+
let (match_str, remaining_str) = if let Some(_) = suggestion.display {
306+
("", suggestion.display.as_ref().unwrap().as_str())
307+
} else {
308+
suggestion.value.split_at(match_len)
309+
};
306310

307311
let suggestion_style_prefix = suggestion
308312
.style
@@ -397,7 +401,7 @@ impl ColumnarMenu {
397401
format!(
398402
"{}{:max$}{}{}",
399403
marker,
400-
&suggestion.value,
404+
suggestion.display_or_value(),
401405
description
402406
.chars()
403407
.take(empty_space)
@@ -414,7 +418,7 @@ impl ColumnarMenu {
414418
format!(
415419
"{}{}{:>empty$}{}",
416420
marker,
417-
&suggestion.value,
421+
suggestion.display_or_value(),
418422
"",
419423
self.end_of_line(column),
420424
empty = empty_space.saturating_sub(marker.len()),
@@ -530,15 +534,17 @@ impl Menu for ColumnarMenu {
530534
self.working_details.col_width = painter.screen_width() as usize;
531535

532536
self.longest_suggestion = self.get_values().iter().fold(0, |prev, suggestion| {
533-
if prev >= suggestion.value.len() {
537+
let suggestion_length = suggestion.display_or_value().len();
538+
if prev >= suggestion_length {
534539
prev
535540
} else {
536-
suggestion.value.len()
541+
suggestion_length
537542
}
538543
});
539544
} else {
540545
let max_width = self.get_values().iter().fold(0, |acc, suggestion| {
541-
let str_len = suggestion.value.len() + self.default_details.col_padding;
546+
let str_len =
547+
suggestion.display_or_value().len() + self.default_details.col_padding;
542548
if str_len > acc {
543549
str_len
544550
} else {
@@ -654,7 +660,9 @@ impl Menu for ColumnarMenu {
654660
// Correcting the enumerate index based on the number of skipped values
655661
let index = index + skip_values;
656662
let column = index as u16 % self.get_cols();
657-
let empty_space = self.get_width().saturating_sub(suggestion.value.len());
663+
let empty_space = self
664+
.get_width()
665+
.saturating_sub(suggestion.display_or_value().len());
658666

659667
self.create_string(suggestion, index, column, empty_space, use_ansi_coloring)
660668
})
@@ -745,6 +753,7 @@ mod tests {
745753
fn fake_suggestion(name: &str, pos: usize) -> Suggestion {
746754
Suggestion {
747755
value: name.to_string(),
756+
display: None,
748757
description: None,
749758
style: None,
750759
extra: None,

src/menu/ide_menu.rs

+1
Original file line numberDiff line numberDiff line change
@@ -1376,6 +1376,7 @@ mod tests {
13761376
fn fake_suggestion(name: &str, pos: usize) -> Suggestion {
13771377
Suggestion {
13781378
value: name.to_string(),
1379+
display: None,
13791380
description: None,
13801381
style: None,
13811382
extra: None,

src/menu/menu_functions.rs

+2
Original file line numberDiff line numberDiff line change
@@ -584,6 +584,7 @@ mod tests {
584584
.into_iter()
585585
.map(|s| Suggestion {
586586
value: s.into(),
587+
display: None,
587588
description: None,
588589
style: None,
589590
extra: None,
@@ -604,6 +605,7 @@ mod tests {
604605
.into_iter()
605606
.map(|s| Suggestion {
606607
value: s.into(),
608+
display: None,
607609
description: None,
608610
style: None,
609611
extra: None,

0 commit comments

Comments
 (0)